编写Ansible角色实现分布式LNMP安装

 前言

本文将介绍如何使用 Ansible 编写角色,在分布式环境下完成 LNMP(Linux、Nginx、MySQL、PHP)的自动化(编译)安装和配置,并验证 PHP 与 MySQL 数据联通性,实现博客和论坛页面的展示。

常规单机部署 LNMP 请参考:LNMP架构搭建-CSDN博客

Docker Dockerfile 单机部署 LNMP 请参考:Docker构建LNMP部署WordPress-CSDN博客

Docker Compose 单机编排部署 LNMP 请参考:Docker-Compose编排LNMP并部署WordPress-CSDN博客

目录

一、环境准备

1. 节点信息表

2. 防火墙以及地址解析

3. 管理节点安装 ansible

4. 免密管理 ssh-keygen 

5. 编辑主机清单

6. 测试联通性

二、准备 roles 模块

1. 创建 roles 以及项目目录

2. 编写 nginx 模块

2.1 准备 files 相关文件

2.1.1 准备 nginx、论坛、博客安装包

2.1.2 准备编译安装 nginx 脚本

2.1.3 创建共享目录脚本

2.2 准备 templates 相关文件

2.2.1 编辑 nginx 配置文件模板

2.3 编写 nginx 模块 task 任务文件

3. 编写 mysql 模块

3.1 准备 files 相关文件

3.1.1 准备 mysql 安装包

3.1.2 准备编译安装 mysql 脚本

3.1.3 创建共享目录脚本

3.2 编写 mysql 模块 task 任务文件

4. 编写 php 模块

4.1 准备 files 相关文件

4.1.1 准备 php 安装包

4.1.2 准备编译安装 php 脚本

4.1.3 编辑 php 主配置文件

4.1.4 编辑 php-fpm 主配置文件

4.1.5 编辑 php-fpm 进程池配置文件

4.2 准备 templates 相关文件

4.3 编写 php 模块 task 任务文件

5. 编写 roles 示例

三、执行角色剧本并验证

1. 查看目录

2. 执行剧本

3. 验证 Wordpress

3.1 创建一个新的配置文件 wp-config.php

3.2 浏览器访问 wordpress

4. 验证 Discuz

4.1 创建一个新的配置文件 config_global.php

4.2 浏览器访问 Discuz


一、环境准备

1. 节点信息表

节点名称IP是否安装Ansible软件版本配置
ansible 管理节点192.168.190.103

ansible 2.9.27

2C2G
nginx 被管理节点192.168.190.104nginx-1.24.08C4G
mysql 被管理节点192.168.190.105mysql-boost-5.7.208C4G
php 被管理节点192.168.190.106php-7.1.108C4G

2. 防火墙以及地址解析

四台机器均需要操作:
systemctl stop firewalld.service 
setenforce 0cat << eof >> /etc/hosts
192.168.190.103 ansible
192.168.190.104 nginx
192.168.190.105 mysql
192.168.190.106 php
eof

3. 管理节点安装 ansible

[root@ansible ~]# yum install -y epel-release
[root@ansible ~]# yum install -y ansible
[root@ansible ~]# ansible --version
ansible 2.9.27config file = /etc/ansible/ansible.cfgconfigured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python2.7/site-packages/ansibleexecutable location = /usr/bin/ansiblepython version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

4. 免密管理 ssh-keygen 

生成 SSH 密钥对:
[root@ansible ~]# ssh-keygen -t rsa      # 一直回车
# rsa表示生成RSA密钥对,RSA是一种非对称加密算法
[root@control ~]# ls .ssh/
id_rsa  id_rsa.pub       # id_rsa 是私钥文件;id_rsa.pub 是公钥文件将本地主机上的SSH公钥复制到远程主机:
[root@ansible ~]# ssh 192.168.190.104 # ssh root@192.168.190.104,默认root
[root@ansible ~]# ssh 192.168.190.105
[root@ansible ~]# ssh 192.168.190.106
[root@ansible ~]# sshpass -p '123' ssh-copy-id 192.168.190.104
[root@ansible ~]# sshpass -p '123' ssh-copy-id 192.168.190.105
[root@ansible ~]# sshpass -p '123' ssh-copy-id 192.168.190.106

5. 编辑主机清单

[root@ansible ~]# vim /etc/ansible/hosts
[nginx]
192.168.190.104 php_server_ip=192.168.190.106 nginx_html_path=/usr/local/nginx/html[mysql]
192.168.190.105[php]
192.168.190.106 php_server_ip=192.168.190.106 nginx_server_ip=192.168.190.104

6. 测试联通性

[root@ansible ~]# ansible all -o -m ping
192.168.190.105 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
192.168.190.104 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
192.168.190.106 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}

二、准备 roles 模块

1. 创建 roles 以及项目目录

一般 roles 目录会默认存在:

[root@ansible ~]# mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta} -p
[root@ansible ~]# mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
[root@ansible ~]# mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p[root@ansible ~]# touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml 
[root@ansible ~]# touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml 
[root@ansible ~]# touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

2. 编写 nginx 模块

2.1 准备 files 相关文件

用来存放由 copy 模块或 script 模块调用的文件。

2.1.1 准备 nginx、论坛、博客安装包
[root@ansible ~]# cd /etc/ansible/roles/nginx/files/
[root@ansible files]# ls
Discuz_X3.4_SC_UTF8.zip  nginx-1.24.0.tar.gz  wordpress-4.9.4-zh_CN.tar.gz
2.1.2 准备编译安装 nginx 脚本
[root@ansible files]# vim lnmp.sh
#/bin/bash
nginx (){
nginxpath=`find / -name "*nginx*tar.gz" -exec dirname {} \; | sed -n '1p'`                #找到安装包路径
nginxapp=`find / -name "*nginx*tar.gz" 2> /dev/null |awk -F/ '{print $NF}' | sed -n '1p'` #打印安装包名称
systemctl status nginx.service > /dev/null
if [ $? -eq 0 ];then     #判断上一条命令返回值是否为真
echo  "nginx服务已安装"
else
useradd -M -s /sbin/nologin nginx  #创建用户
echo "正在安装nginx服务,请耐心等待"
tar xf  ${nginxpath}/${nginxapp} -C ${nginxpath} #解压安装包到其路径下
nginxd=`find  ${nginxpath} -maxdepth 1 -type d | grep  nginx- | awk -F/ '{print $NF}'` 
#只搜索当前目录,然后筛选出包含nginx- 字符串的目录,并打印这些目录的名称(去掉路径部分),-maxdepth 1表示只搜索当前目录,不搜索子目录
cd  ${nginxpath}/${nginxd}yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-devel  &>>/dev/null
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module  > /dev/null
make -j `lscpu | sed -n '4p' | awk '{print $2}'`&> /dev/null
make  install  &> /dev/nullh
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
cat >  /usr/lib/systemd/system/nginx.service  << EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -1 $MAINPID
ExecStop=/bin/kill -3 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
chown -R nginx.nginx  /usr/local/nginx
systemctl  daemon-reload  &> /dev/null#准备安装论坛文件
discuz=`find / -name "*scuz*UTF*.zip" -exec dirname {} \; | sed -n '1p'`
discuzapp=`find  /  -name  "*scuz*UTF*.zip" 2>>/dev/null |awk  -F/ '{print $NF}' | sed -n '1p'`
unzip ${discuz}/${discuzapp}  -d /usr/local/  >>/dev/null
discuzd=`find /usr/local  -maxdepth 1  -type  d  |grep  UTF|awk  -F/  '{print $NF}' | sed -n '1p'`
cp -r /usr/local/${discuzd}/upload/  /usr/local/nginx/html/bbs/
chmod -R 777 /usr/local/nginx/html/bbs/config/
chmod -R 777 /usr/local/nginx/html/bbs/data/
chmod -R 777 /usr/local/nginx/html/bbs/uc_client/
chmod -R 777 /usr/local/nginx/html/bbs/uc_server/
ip=`ifconfig ens33|awk /netmask/'{print $2}'`#准备安装博客文件"
wordpresspath=`find / -name "*wordpress*" -exec dirname {} \; | sed -n '1p'`                   #找到安装包路径
wordpressapp=`find / -name "*wordpress*" 2> /dev/null | awk  -F/ '{print $NF}' | sed -n '1p'`  #打印安装包名称
tar xf ${wordpresspath}/${wordpressapp} -C /usr/local/nginx/html/ > /dev/null
chmod 777 -R /usr/local/nginx/html/
fi
}mysql (){
mysqlpath=`find / -name "*mysql*tar.gz" -exec dirname {} \; | sed -n '1p'`
mysqlapp=`find / -name *mysql*tar.gz 2> /dev/null |awk  -F/ '{print $NF}' | sed -n '1p'`
#准备安装MySQL
systemctl start mysqld.service &> /dev/null
if [ $? -eq 0 ];then
echo "mysql is exist"
else
#安装Mysql环境依赖包
yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel &> /dev/null
#创建运行用户
useradd -M -s /sbin/nologin  mysql#编译安装
#解压mysql源码包
tar xf ${mysqlpath}/${mysqlapp} -C ${mysqlpath}
mysqld=`find  ${mysqlpath} -maxdepth 1 -type d | grep mysql- | awk -F/ '{print $NF}'`
cd  ${mysqlpath}/${mysqld}#执行cmake命令
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1   &>>/dev/null#执行make命令
make  -j `lscpu|sed -n '4p'|awk '{print $2}'` &>>/dev/null
make install > /dev/null#修改mysql 配置文件
cat > /etc/my.cnf <<EOF
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
EOF#更改mysql安装目录和配置文件的属主属组
chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf#初始化数据库
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data  &> /dev/null#添加mysqld系统服务
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload  &> /dev/null
systemctl start mysqld.service
systemctl enable mysqld &> /dev/null
echo  "5.----mysql服务已开启----"ln -s /usr/local/mysql/bin/mysql /usr/bin/
echo   "正在创建bbs数据库,并授权用户"
/usr/local/mysql/bin/mysql  -uroot  -e "set password for 'root'@'localhost' = password ('123456');"
/usr/local/mysql/bin/mysql  -uroot  -p'123456' -e 'create database bbs;' &> /dev/null
/usr/local/mysql/bin/mysql  -uroot  -p'123456' -e "grant all on bbs.* to 'bbsuser'@'%' identified by '123456';" &> /dev/null
/usr/local/mysql/bin/mysql  -uroot  -p'123456' -e "grant all on bbs.* to 'bbsuser'@'localhost' identified by '123456';" &> /dev/null
/usr/local/mysql/bin/mysql  -uroot  -p'123456' -e 'flush privileges;' &> /dev/nullecho   "正在创建wordpress数据库,并授权用户"
/usr/local/mysql/bin/mysql  -uroot  -p'123456' -e 'create database wordpress;' &> /dev/null
/usr/local/mysql/bin/mysql  -uroot  -p'123456' -e 'grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';' &> /dev/null
/usr/local/mysql/bin/mysql  -uroot  -p'123456' -e 'grant all privileges on *.* to 'root'@'%' identified by '123456';' &> /dev/null
/usr/local/mysql/bin/mysql  -uroot  -p'123456' -e 'flush privileges;' &> /dev/null
fi
}php (){
phppath=`find / -name *php*tar* -exec dirname {} \; | sed -n '1p'`
phpapp=`find / -name *php*tar* 2> /dev/null |awk -F/ '{print $NF}' | sed -n '1p'`
#安装编译环境
systemctl start php-fpm.service &> /dev/null
if [ $? -eq 0 ];then
echo "php服务已安装"
else
echo "安装PHP服务"
#安装编译环境"
yum -y install gd libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel bison re2c libxml2 libxml2-devel zlib zlib-devel curl curl-devel gcc gcc-c++ openssl openssl-devel &> /dev/null
#编译安装
useradd -M -s /sbin/nologin nginx#解压源码包
tar xf ${phppath}/${phpapp} -C ${phppath}
phpd=`find  ${phppath} -maxdepth 1 -type d |grep  php-|awk  -F/  '{print  $NF}'`
cd  /${phppath}/${phpd}#检测编译环境,并生成Makefile文件
./configure  --prefix=/usr/local/php --with-mysql-sock=/usr/local/mysql/mysql.sock --with-mysqli --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-fpm --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo --enable-tokenizer --enable-zip &>>/dev/null #环境检测完成,正在执行make命令,进行编译
make -j `lscpu|sed -n '4p'|awk '{print $2}'` &> /dev/null#执行make install命令,将生成的程序或库文件复制到系统指定的位置进行安装
make install > /dev/null
ln -s /usr/local/php/bin/* /usr/local/bin/
ln -s /usr/local/php/sbin/* /usr/local/sbin/
cp /${phppath}/${phpd}/sapi/fpm/php-fpm.service /usr/lib/systemd/system/php-fpm.service
systemctl daemon-reload  > /dev/null
fi
}
$1
2.1.3 创建共享目录脚本
[root@ansible files]# vim nginx_nfs.sh
#!/bin/bash
echo "/usr/local/nginx/html *(rw)" > /etc/exports
# *(rw)表示所有主机都可以以读写模式访问该共享目录
# /etc/exports是NFS(Network File System)服务器的配置文件
chmod -R 777 /usr/local/nginx/html/
systemctl start rpcbind
systemctl start nfs[root@ansible files]# ls
Discuz_X3.4_SC_UTF8.zip  lnmp.sh  nginx-1.24.0.tar.gz  nginx_nfs.sh  wordpress-4.9.4-zh_CN.tar.gz

2.2 准备 templates 相关文件

用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件

2.2.1 编辑 nginx 配置文件模板

注意两个变量:php_server_ip,nginx_html_path

[root@ansible files]# cd ../templates/
[root@ansible templates]# vim nginx.conf.j2
#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;server {listen       80;server_name  localhost;charset utf-8;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.php;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000#location ~ \.php$ {root           html;fastcgi_pass   {{php_server_ip}}:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  {{nginx_html_path}}$fastcgi_script_name;include        fastcgi_params;}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443 ssl;#    server_name  localhost;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.key;#    ssl_session_cache    shared:SSL:1m;#    ssl_session_timeout  5m;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers  on;#    location / {#        root   html;#        index  index.html index.htm;#    }#}}

2.3 编写 nginx 模块 task 任务文件

此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。

[root@ansible templates]# cd ../tasks/
[root@ansible tasks]# vim main.yml
- name: copy nginx packagecopy: src=/etc/ansible/roles/nginx/files/nginx-1.24.0.tar.gz dest=/opt
- name: copy wordpress packagecopy: src=/etc/ansible/roles/nginx/files/Discuz_X3.4_SC_UTF8.zip dest=/opt
- name: copy Discuz packagecopy: src=/etc/ansible/roles/nginx/files/wordpress-4.9.4-zh_CN.tar.gz dest=/opt
- name: install nginx shellscript: /etc/ansible/roles/nginx/files/lnmp.sh nginx
- name: copy conf.j2template: src=/etc/ansible/roles/nginx/templates/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf owner=nginx group=nginx
- name: nfs shellscript: /etc/ansible/roles/nginx/files/nginx_nfs.sh
- name: start nginx serviceservice: enabled=true name=nginx state=started

3. 编写 mysql 模块

3.1 准备 files 相关文件

3.1.1 准备 mysql 安装包
[root@ansible tasks]# cd ../../mysql/files/
[root@ansible files]# ls
mysql-boost-5.7.20.tar.gz
3.1.2 准备编译安装 mysql 脚本

同 2.1.2 脚本一致:

[root@ansible files]# cp /etc/ansible/roles/nginx/files/lnmp.sh .
3.1.3 创建共享目录脚本
[root@ansible files]# vim mysql_nfs.sh
#!/bin/bash
echo "/usr/local/mysql  *(rw)" > /etc/exports
chmod -R 777 /usr/local/mysql/
systemctl start rpcbind
systemctl start nfs

3.2 编写 mysql 模块 task 任务文件

此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件 

[root@ansible files]# cd ../tasks/
[root@ansible tasks]# vim main.yml
- name: copy packagecopy: src=/etc/ansible/roles/mysql/files/mysql-boost-5.7.20.tar.gz dest=/opt/
- name: install mysql shellscript: /etc/ansible/roles/mysql/files/lnmp.sh mysql
- name: nfs shellscript: /etc/ansible/roles/mysql/files/mysql_nfs.sh

4. 编写 php 模块

4.1 准备 files 相关文件

4.1.1 准备 php 安装包
[root@ansible vars]# cd ../../php/files/
[root@ansible files]# ls
php-7.1.10.tar.bz2
4.1.2 准备编译安装 php 脚本

同 2.1.2 脚本一致:

[root@ansible files]# cp /etc/ansible/roles/nginx/files/lnmp.sh .
4.1.3 编辑 php 主配置文件
[root@ansible files]# egrep -v "^;" php.ini | egrep -v "^$"
[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = On
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[CLI Server]
cli_server.color = On
[Date]
date.timezone = Asia/Shanghai
[filter]
[iconv]
[intl]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = On
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket = /usr/local/mysql/mysql.sock
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = On
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = 1
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[mcrypt]
[dba]
[opcache]
[curl]
[openssl]
4.1.4 编辑 php-fpm 主配置文件
[root@ansible files]# egrep -v "^;" php-fpm.conf | egrep -v "^$"
[global]
pid = run/php-fpm.pid
include=/usr/local/php/etc/php-fpm.d/*.conf
4.1.5 编辑 php-fpm 进程池配置文件

这步可选,如果直接复制配置文件至 templates 文件夹模板 .j2 文件自带变量会报错。

[root@ansible files]# egrep -v "^;" www.conf | egrep -v "^$"
[www]
user = nginx
group = nginx
listen = 192.168.190.106:9000      # php 地址
listen.allowed_clients = 127.0.0.1,192.168.190.104  # nginx 地址
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

4.2 准备 templates 相关文件

[root@ansible files]# cd ../templates/
[root@ansible templates]# vim www.conf.j2
[www]
user = nginx
group = nginx
listen = {{php_server_ip}}:9000
listen.allowed_clients = 127.0.0.1,{{nginx_server_ip}}
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

4.3 编写 php 模块 task 任务文件

此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件 

[root@ansible templates]# cd ../tasks/
[root@ansible tasks]# vim main.yml 
- name: copy packagecopy: src=/etc/ansible/roles/php/files/php-7.1.10.tar.bz2 dest=/opt/
- name: create mysql nfs pathfile: path=/usr/local/mysql/ state=directory
- name: create nginx nfs pathfile: path=/usr/local/nginx/html/ state=directory
- name: mount nfs mysql shareansible.builtin.mount: src=192.168.190.105:/usr/local/mysql path=/usr/local/mysql fstype=nfs opts=defaults state=mounted
- name: mount nfs nginx share ansible.builtin.mount: src=192.168.190.104:/usr/local/nginx/html path=/usr/local/nginx/html fstype=nfs opts=defaults state=mounted
- name: install php shellscript: /etc/ansible/roles/php/files/lnmp.sh php
- name: copy php-fpm.confcopy: src=/etc/ansible/roles/php/files/php-fpm.conf dest=/usr/local/php/etc/php-fpm.conf
- name: copy php.inicopy: src=/etc/ansible/roles/php/files/php.ini dest=/usr/local/php/lib/php.ini
- name: copy www.conftemplate: src=/etc/ansible/roles/php/templates/www.conf.j2 dest=/usr/local/php/etc/php-fpm.d/www.conf
- name: start php-fpm serverservice: name=php-fpm state=started

5. 编写 roles 示例

[root@ansible vars]# cd /etc/ansible/
[root@ansible ansible]# vim lnmp.yml
---
- hosts: nginxremote_user: rootroles:- nginx
- hosts: mysqlremote_user: rootroles:- mysql
- hosts: phpremote_user: rootroles:- php
...

三、执行角色剧本并验证

1. 查看目录

[root@ansible ansible]# ls
ansible.cfg  hosts  lnmp.yml  roles
[root@ansible ansible]# tree
.
├── ansible.cfg
├── hosts
├── lnmp.yml
└── roles├── mysql│   ├── defaults│   │   └── main.yml│   ├── files│   │   ├── lnmp.sh│   │   ├── mysql-boost-5.7.20.tar.gz│   │   └── mysql_nfs.sh│   ├── handlers│   │   └── main.yml│   ├── meta│   │   └── main.yml│   ├── tasks│   │   └── main.yml│   ├── templates│   └── vars│       └── main.yml├── nginx│   ├── defaults│   │   └── main.yml│   ├── files│   │   ├── Discuz_X3.4_SC_UTF8.zip│   │   ├── lnmp.sh│   │   ├── nginx-1.24.0.tar.gz│   │   ├── nginx_nfs.sh│   │   └── wordpress-4.9.4-zh_CN.tar.gz│   ├── handlers│   │   └── main.yml│   ├── meta│   │   └── main.yml│   ├── tasks│   │   └── main.yml│   ├── templates│   │   └── nginx.conf.j2│   └── vars│       └── main.yml└── php├── defaults│   └── main.yml├── files│   ├── lnmp.sh│   ├── php-7.1.10.tar.bz2│   ├── php-fpm.conf│   ├── php.ini│   └── www.conf├── handlers│   └── main.yml├── meta│   └── main.yml├── tasks│   └── main.yml├── templates│   └── www.conf.j2└── vars└── main.yml

2. 执行剧本

[root@ansible ansible]# ansible-playbook lnmp.ymlPLAY [nginx] **************************************************************************************TASK [Gathering Facts] ****************************************************************************
ok: [192.168.190.104]TASK [copy nginx package] *************************************************************************
changed: [192.168.190.104]TASK [nginx : copy wordpress package] *************************************************************
changed: [192.168.190.104]TASK [nginx : copy Discuz dpackage] ***************************************************************
changed: [192.168.190.104]TASK [install nginx shell] ************************************************************************
changed: [192.168.190.104]TASK [nginx : copy conf.j2] ***********************************************************************
changed: [192.168.190.104]TASK [nginx : nfs shell] **************************************************************************
changed: [192.168.190.104]TASK [start nginx service] ************************************************************************
changed: [192.168.190.104]PLAY [mysql] **************************************************************************************TASK [Gathering Facts] ****************************************************************************
ok: [192.168.190.105]TASK [mysql : copy package] ***********************************************************************
changed: [192.168.190.105]TASK [install mysql shell] ******************************************************************************
changed: [192.168.190.105]TASK [mysql : nfs shell] **************************************************************************
changed: [192.168.190.105]PLAY [php] ****************************************************************************************TASK [Gathering Facts] ****************************************************************************
ok: [192.168.190.106]TASK [php : copy package] *************************************************************************
changed: [192.168.190.106]TASK [php : create mysql nfs path] ****************************************************************
changed: [192.168.190.106]TASK [php : create nginx nfs path] ****************************************************************
changed: [192.168.190.106]TASK [php : mount nfs mysql share] ****************************************************************
changed: [192.168.190.106]TASK [php : mount nfs nginx share] ****************************************************************
changed: [192.168.190.106]TASK [install php shell] ********************************************************************************
changed: [192.168.190.106]TASK [copy php-fpm.conf] **************************************************************************
changed: [192.168.190.106]TASK [copy php.ini] *******************************************************************************
changed: [192.168.190.106]TASK [php : copy www.conf] ************************************************************************
changed: [192.168.190.106]TASK [start php-fpm server] ***********************************************************************
changed: [192.168.190.106]PLAY RECAP ****************************************************************************************
192.168.190.104            : ok=8    changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.190.105            : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.190.106            : ok=11   changed=10   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

3. 验证 Wordpress

3.1 创建一个新的配置文件 wp-config.php

[root@nginx ~]# cd /usr/local/nginx/html/wordpress
[root@nginx wordpress]# cp wp-config-sample.php wp-config.php
[root@nginx wordpress]# vim wp-config.php
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');/** MySQL数据库用户名 */
define('DB_USER', 'wordpress');/** MySQL数据库密码 */
define('DB_PASSWORD', '123456');/** MySQL主机 */
define('DB_HOST', '192.168.190.105:3306');

3.2 浏览器访问 wordpress

访问192.168.190.104/wordpress/index.php

4. 验证 Discuz

4.1 创建一个新的配置文件 config_global.php

[root@nginx ~]# cd /usr/local/nginx/html/bbs/config
[root@nginx config]# cp config_global_default.php config_global.php
[root@nginx config]# chmod 777 config_global.php
[root@nginx config]# vim config_global.php
// ----------------------------  CONFIG DB  ----------------------------- //
$_config['db']['1']['dbhost'] = '192.168.190.105:3306';  # 数据库地址端口
$_config['db']['1']['dbuser'] = 'bbsuser';               # 用户名
$_config['db']['1']['dbpw'] = '123456';                  # 密码

4.2 浏览器访问 Discuz

访问192.168.190.104/bbs/install/index.php

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt---信号和槽

一、信号和槽机制 所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是没有目的的&#xff0c;类似广播。如果有对象对这个信号…

二叉树的四种遍历代码实现

二叉树的遍历大致能分为以下几种 1.前序&#xff1a;根 左 右 2.中序&#xff1a;左 根 右 3.后序&#xff1a;左 右 根 4.层序&#xff1a;从根开始一层一层的向下 如上图访问顺序: 前序&#xff1a;1 2 3 N N N 4 5 N N 6 N N 中序&#xff1a;N 3 N 2 N 1 N 5 N 4 N …

docker-compose安装emqx集群(最新)(host模式)

机器&#xff1a; 10.60.0.20 10.60.0.21 10.60.0.22 一、三台机子都配置域名&#xff08;/etc/hosts&#xff09; 10.60.0.20 node1.emqx.io 10.60.0.22 node3.emqx.io 10.60.0.21 node2.emqx.io 二、docker-compose.yml&#xff08;10.60.0.21&#xff09; 其他两台机子自…

接搭建仿美团、代付系统源码搭建教程

最近很多粉丝催更、分享一下地球号&#xff1a;xiaobao0214520(WX) 现在大家都很流行搞网恋&#xff0c;我们搭建一个跟美团相似的系统 然后开发一个好友代付&#xff0c;我们在点单的时候转发链接让网恋对象付钱 若只是单点外卖的话&#xff0c;能榨出的油水还是太少。 所以…

Golang — map的使用心得和底层原理

map作为一种基础的数据结构&#xff0c;在算法和项目中有着非常广泛的应用&#xff0c;以下是自己总结的map使用心得、实现原理、扩容机制和增删改查过程。 1.使用心得&#xff1a; 1.1 当map为nil和map为空时&#xff0c;增删改查操作时会出现的不同情况 我们可以发现&#…

【全开源】废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp

介绍 一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序 功能特性 1、会员注册 支持小程序授权注册和手机号注册 2、回收品类 可设置回收品类&#xff0c;废纸、废金属、废玻璃、旧衣服等 3、今日指导价…

面试高频知识点:Java互联网大厂高频面试题(持续收录)

文章目录 前言一、Java基础题1、Java语言的三大特性2、JDK 和 JRE 有什么区别3、Java基本数据类型及其封装类4、说明一下public static void main(String args[])这段声明里关键字的作用5、java的数据结构有哪些&#xff1f;6、抽象类和接口的区别?7、 与 equals 的区别8、Str…

WordPress插件Show IDs by Echo,后台显示文章、页面、分类、标签、媒体库、评论、用户的ID

WordPress的这款Show IDs by Echo插件&#xff0c;可以让我们设置是增加一列ID还是直接在“编辑 |快速编辑 |查看”操作后面增加ID&#xff0c;而且支持展示以下内容的ID&#xff1a; 文章页面类别标签评论自定义帖子类型自定义分类法用户媒体 Show IDs by Echo插件的安装及启…

企业级OV SSL证书:强化在线信任与安全的权威之选

在数字经济浪潮下&#xff0c;企业网站的安全性直接影响着用户信任度和业务的可持续发展。其中&#xff0c;企业级组织验证&#xff08;Organization Validation&#xff0c;简称OV&#xff09;SSL证书作为安全解决方案的重要一环&#xff0c;以其独有的优势&#xff0c;在众多…

网安面经之文件包含漏洞

一、文件包含漏洞 1、文件包含漏洞原理&#xff1f;危害&#xff1f;修复&#xff1f; 原理&#xff1a;开发⼈员⼀般希望代码更灵活&#xff0c;所以将被包含的⽂件设置为变量&#xff0c;⽤来进⾏动态调⽤&#xff0c;但是由于⽂件包含函数加载的参数没有经过过滤或者严格的…

LVDS 源同步接口

传统数据传输通常采用系统同步传输方式&#xff0c;多个器件基于同一时钟源进行系统同步&#xff0c;器件之间的数据传输时序关系以系统时钟为参考&#xff0c;如图1所示。系统同步传输方式使各器件处于同步工作模式&#xff0c;但器件之间传输数据的传输时延难以确定&#xff…

火山引擎VeDI:A/B测试平台指标能力升级,助力企业提升精细化运营效率

在数字化浪潮的推动下&#xff0c;数据分析与精细化运营已成为企业提升竞争力的关键。近日&#xff0c;火山引擎A/B测试DataTester完成了指标能力的全面升级&#xff0c;为企业在流量竞争激烈的市场中提供了更强大、更可信的数据支持。 此次升级亮点在于引入了“按某个属性去重…

局域网内访问vue3项目|Network: use --host to expose

背景 我希望在相同的局域网内&#xff0c;通过手机访问我在Vue 3项目中展示的效果 遇到的问题 使用Vue CLI的–host选项实现局域网内的应用程序测试 当使用Vue CLI在本地提供服务时&#xff0c;通过使用 --host 选项&#xff0c;你可以指定要公开应用程序的主机。默认情况下&a…

[Linux] 入门指令详解

目录 ls指令 pwd指令 whoami指令 cd指令 clear指令 touch指令 mkdir指令 rmdir指令 rm指令 man指令 cp指令 mv指令 cat指令 tac指令 more指令 less指令 head指令 tail指令 拓展&#xff1a;如何读取文件中间某一段内容&#xff1f; date指令 cal指令 fin…

代码随想录阅读笔记-动态规划【爬楼梯】

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬到楼…

Ubuntu上使用audit2allow解决Android Selinux问题

1.安装工具 sudo apt install policycoreutils 2.运行命令 提前用dmesg或者串口抓取kernel log 遇到错误&#xff0c;提示需要用-p指定policy file&#xff0c;然偶尝试创建一个policy空文件&#xff0c;用-p选项&#xff0c;遇到如下错误 3.规避问题 首先跟进错误log的堆栈…

C++指针和动态内存分配细节,反汇编,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体&#xff0c;占用内存空间&#xff0c;逻辑上独立&#xff1b;引用是别名&#xff0c;与变量共享内存空间&#xff0c;逻辑上不独立。指针定义时可以不初始化&#xff1b;引用定义时必须初始化。指针的…

mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’

问题&#xff1a; mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’ 解决方法&#xff1a; 需要修改数据集加载的代码文件&#xff0c;数据集文件在路径configs/base/datasets/coco_detection.py里面&#xff0c;需要增加meta…

【GD32F470紫藤派使用手册】第五讲 PMU-低功耗实验

5.1 实验内容 通过本实验主要学习以下内容&#xff1a; PMU原理&#xff1b; 低功耗的进入以及退出操作&#xff1b; 5.2 实验原理 5.2.1 PMU结构原理 PMU即电源管理单元&#xff0c;其内部结构下图所示&#xff0c;由该图可知&#xff0c;GD32F4xx系列MCU具有三个电源域…

驱动丹佛斯比例电磁铁放大器

驱动丹佛斯比例电磁铁是一种用于实现对液压系统连续且精确控制的通电带磁性装置。比例阀由直流比例电磁铁和液压阀两部分组成。其中&#xff0c;比例电磁铁是其核心部件&#xff0c;负责将输入的电信号转换成力和位移输出&#xff0c;从而控制液压阀的工作状态。比例电磁铁通过…