• 编写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. 防火墙以及地址解析

    1. 四台机器均需要操作:
    2. systemctl stop firewalld.service
    3. setenforce 0
    4. cat << eof >> /etc/hosts
    5. 192.168.190.103 ansible
    6. 192.168.190.104 nginx
    7. 192.168.190.105 mysql
    8. 192.168.190.106 php
    9. eof

    3. 管理节点安装 ansible

    1. [root@ansible ~]# yum install -y epel-release
    2. [root@ansible ~]# yum install -y ansible
    3. [root@ansible ~]# ansible --version
    4. ansible 2.9.27
    5. config file = /etc/ansible/ansible.cfg
    6. configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
    7. ansible python module location = /usr/lib/python2.7/site-packages/ansible
    8. executable location = /usr/bin/ansible
    9. python 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 

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

    5. 编辑主机清单

    1. [root@ansible ~]# vim /etc/ansible/hosts
    2. [nginx]
    3. 192.168.190.104 php_server_ip=192.168.190.106 nginx_html_path=/usr/local/nginx/html
    4. [mysql]
    5. 192.168.190.105
    6. [php]
    7. 192.168.190.106 php_server_ip=192.168.190.106 nginx_server_ip=192.168.190.104

    6. 测试联通性

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

    二、准备 roles 模块

    1. 创建 roles 以及项目目录

    一般 roles 目录会默认存在:

    1. [root@ansible ~]# mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta} -p
    2. [root@ansible ~]# mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
    3. [root@ansible ~]# mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
    4. [root@ansible ~]# touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
    5. [root@ansible ~]# touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
    6. [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、论坛、博客安装包
    1. [root@ansible ~]# cd /etc/ansible/roles/nginx/files/
    2. [root@ansible files]# ls
    3. Discuz_X3.4_SC_UTF8.zip nginx-1.24.0.tar.gz wordpress-4.9.4-zh_CN.tar.gz
    2.1.2 准备编译安装 nginx 脚本
    1. [root@ansible files]# vim lnmp.sh
    2. #/bin/bash
    3. nginx (){
    4. nginxpath=`find / -name "*nginx*tar.gz" -exec dirname {} \; | sed -n '1p'` #找到安装包路径
    5. nginxapp=`find / -name "*nginx*tar.gz" 2> /dev/null |awk -F/ '{print $NF}' | sed -n '1p'` #打印安装包名称
    6. systemctl status nginx.service > /dev/null
    7. if [ $? -eq 0 ];then #判断上一条命令返回值是否为真
    8. echo "nginx服务已安装"
    9. else
    10. useradd -M -s /sbin/nologin nginx #创建用户
    11. echo "正在安装nginx服务,请耐心等待"
    12. tar xf ${nginxpath}/${nginxapp} -C ${nginxpath} #解压安装包到其路径下
    13. nginxd=`find ${nginxpath} -maxdepth 1 -type d | grep nginx- | awk -F/ '{print $NF}'`
    14. #只搜索当前目录,然后筛选出包含nginx- 字符串的目录,并打印这些目录的名称(去掉路径部分),-maxdepth 1表示只搜索当前目录,不搜索子目录
    15. cd ${nginxpath}/${nginxd}
    16. yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel &>>/dev/null
    17. ./configure --prefix=/usr/local/nginx \
    18. --user=nginx \
    19. --group=nginx \
    20. --with-http_ssl_module \
    21. --with-http_v2_module \
    22. --with-http_realip_module \
    23. --with-http_stub_status_module \
    24. --with-http_gzip_static_module \
    25. --with-pcre \
    26. --with-stream \
    27. --with-stream_ssl_module \
    28. --with-stream_realip_module > /dev/null
    29. make -j `lscpu | sed -n '4p' | awk '{print $2}'`&> /dev/null
    30. make install &> /dev/nullh
    31. ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    32. cat > /usr/lib/systemd/system/nginx.service << EOF
    33. [Unit]
    34. Description=nginx
    35. After=network.target
    36. [Service]
    37. Type=forking
    38. PIDFile=/usr/local/nginx/logs/nginx.pid
    39. ExecStart=/usr/local/nginx/sbin/nginx
    40. ExecReload=/bin/kill -1 $MAINPID
    41. ExecStop=/bin/kill -3 $MAINPID
    42. PrivateTmp=true
    43. [Install]
    44. WantedBy=multi-user.target
    45. EOF
    46. chown -R nginx.nginx /usr/local/nginx
    47. systemctl daemon-reload &> /dev/null
    48. #准备安装论坛文件
    49. discuz=`find / -name "*scuz*UTF*.zip" -exec dirname {} \; | sed -n '1p'`
    50. discuzapp=`find / -name "*scuz*UTF*.zip" 2>>/dev/null |awk -F/ '{print $NF}' | sed -n '1p'`
    51. unzip ${discuz}/${discuzapp} -d /usr/local/ >>/dev/null
    52. discuzd=`find /usr/local -maxdepth 1 -type d |grep UTF|awk -F/ '{print $NF}' | sed -n '1p'`
    53. cp -r /usr/local/${discuzd}/upload/ /usr/local/nginx/html/bbs/
    54. chmod -R 777 /usr/local/nginx/html/bbs/config/
    55. chmod -R 777 /usr/local/nginx/html/bbs/data/
    56. chmod -R 777 /usr/local/nginx/html/bbs/uc_client/
    57. chmod -R 777 /usr/local/nginx/html/bbs/uc_server/
    58. ip=`ifconfig ens33|awk /netmask/'{print $2}'`
    59. #准备安装博客文件"
    60. wordpresspath=`find / -name "*wordpress*" -exec dirname {} \; | sed -n '1p'` #找到安装包路径
    61. wordpressapp=`find / -name "*wordpress*" 2> /dev/null | awk -F/ '{print $NF}' | sed -n '1p'` #打印安装包名称
    62. tar xf ${wordpresspath}/${wordpressapp} -C /usr/local/nginx/html/ > /dev/null
    63. chmod 777 -R /usr/local/nginx/html/
    64. fi
    65. }
    66. mysql (){
    67. mysqlpath=`find / -name "*mysql*tar.gz" -exec dirname {} \; | sed -n '1p'`
    68. mysqlapp=`find / -name *mysql*tar.gz 2> /dev/null |awk -F/ '{print $NF}' | sed -n '1p'`
    69. #准备安装MySQL
    70. systemctl start mysqld.service &> /dev/null
    71. if [ $? -eq 0 ];then
    72. echo "mysql is exist"
    73. else
    74. #安装Mysql环境依赖包
    75. 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
    76. #创建运行用户
    77. useradd -M -s /sbin/nologin mysql
    78. #编译安装
    79. #解压mysql源码包
    80. tar xf ${mysqlpath}/${mysqlapp} -C ${mysqlpath}
    81. mysqld=`find ${mysqlpath} -maxdepth 1 -type d | grep mysql- | awk -F/ '{print $NF}'`
    82. cd ${mysqlpath}/${mysqld}
    83. #执行cmake命令
    84. cmake \
    85. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
    86. -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
    87. -DSYSCONFDIR=/etc \
    88. -DSYSTEMD_PID_DIR=/usr/local/mysql \
    89. -DDEFAULT_CHARSET=utf8 \
    90. -DDEFAULT_COLLATION=utf8_general_ci \
    91. -DWITH_EXTRA_CHARSETS=all \
    92. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    93. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
    94. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
    95. -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
    96. -DMYSQL_DATADIR=/usr/local/mysql/data \
    97. -DWITH_BOOST=boost \
    98. -DWITH_SYSTEMD=1 &>>/dev/null
    99. #执行make命令
    100. make -j `lscpu|sed -n '4p'|awk '{print $2}'` &>>/dev/null
    101. make install > /dev/null
    102. #修改mysql 配置文件
    103. cat > /etc/my.cnf <<EOF
    104. [client]
    105. port = 3306
    106. socket=/usr/local/mysql/mysql.sock
    107. [mysqld]
    108. user = mysql
    109. basedir=/usr/local/mysql
    110. datadir=/usr/local/mysql/data
    111. port = 3306
    112. character-set-server=utf8
    113. pid-file = /usr/local/mysql/mysqld.pid
    114. socket=/usr/local/mysql/mysql.sock
    115. bind-address = 0.0.0.0
    116. skip-name-resolve
    117. max_connections=2048
    118. default-storage-engine=INNODB
    119. max_allowed_packet=16M
    120. server-id = 1
    121. sql_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
    122. EOF
    123. #更改mysql安装目录和配置文件的属主属组
    124. chown -R mysql:mysql /usr/local/mysql/
    125. chown mysql:mysql /etc/my.cnf
    126. #初始化数据库
    127. cd /usr/local/mysql/bin/
    128. ./mysqld \
    129. --initialize-insecure \
    130. --user=mysql \
    131. --basedir=/usr/local/mysql \
    132. --datadir=/usr/local/mysql/data &> /dev/null
    133. #添加mysqld系统服务
    134. cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
    135. systemctl daemon-reload &> /dev/null
    136. systemctl start mysqld.service
    137. systemctl enable mysqld &> /dev/null
    138. echo "5.----mysql服务已开启----"
    139. ln -s /usr/local/mysql/bin/mysql /usr/bin/
    140. echo "正在创建bbs数据库,并授权用户"
    141. /usr/local/mysql/bin/mysql -uroot -e "set password for 'root'@'localhost' = password ('123456');"
    142. /usr/local/mysql/bin/mysql -uroot -p'123456' -e 'create database bbs;' &> /dev/null
    143. /usr/local/mysql/bin/mysql -uroot -p'123456' -e "grant all on bbs.* to 'bbsuser'@'%' identified by '123456';" &> /dev/null
    144. /usr/local/mysql/bin/mysql -uroot -p'123456' -e "grant all on bbs.* to 'bbsuser'@'localhost' identified by '123456';" &> /dev/null
    145. /usr/local/mysql/bin/mysql -uroot -p'123456' -e 'flush privileges;' &> /dev/null
    146. echo "正在创建wordpress数据库,并授权用户"
    147. /usr/local/mysql/bin/mysql -uroot -p'123456' -e 'create database wordpress;' &> /dev/null
    148. /usr/local/mysql/bin/mysql -uroot -p'123456' -e 'grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';' &> /dev/null
    149. /usr/local/mysql/bin/mysql -uroot -p'123456' -e 'grant all privileges on *.* to 'root'@'%' identified by '123456';' &> /dev/null
    150. /usr/local/mysql/bin/mysql -uroot -p'123456' -e 'flush privileges;' &> /dev/null
    151. fi
    152. }
    153. php (){
    154. phppath=`find / -name *php*tar* -exec dirname {} \; | sed -n '1p'`
    155. phpapp=`find / -name *php*tar* 2> /dev/null |awk -F/ '{print $NF}' | sed -n '1p'`
    156. #安装编译环境
    157. systemctl start php-fpm.service &> /dev/null
    158. if [ $? -eq 0 ];then
    159. echo "php服务已安装"
    160. else
    161. echo "安装PHP服务"
    162. #安装编译环境"
    163. 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
    164. #编译安装
    165. useradd -M -s /sbin/nologin nginx
    166. #解压源码包
    167. tar xf ${phppath}/${phpapp} -C ${phppath}
    168. phpd=`find ${phppath} -maxdepth 1 -type d |grep php-|awk -F/ '{print $NF}'`
    169. cd /${phppath}/${phpd}
    170. #检测编译环境,并生成Makefile文件
    171. ./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
    172. #环境检测完成,正在执行make命令,进行编译
    173. make -j `lscpu|sed -n '4p'|awk '{print $2}'` &> /dev/null
    174. #执行make install命令,将生成的程序或库文件复制到系统指定的位置进行安装
    175. make install > /dev/null
    176. ln -s /usr/local/php/bin/* /usr/local/bin/
    177. ln -s /usr/local/php/sbin/* /usr/local/sbin/
    178. cp /${phppath}/${phpd}/sapi/fpm/php-fpm.service /usr/lib/systemd/system/php-fpm.service
    179. systemctl daemon-reload > /dev/null
    180. fi
    181. }
    182. $1
    2.1.3 创建共享目录脚本
    1. [root@ansible files]# vim nginx_nfs.sh
    2. #!/bin/bash
    3. echo "/usr/local/nginx/html *(rw)" > /etc/exports
    4. # *(rw)表示所有主机都可以以读写模式访问该共享目录
    5. # /etc/exports是NFS(Network File System)服务器的配置文件
    6. chmod -R 777 /usr/local/nginx/html/
    7. systemctl start rpcbind
    8. systemctl start nfs
    9. [root@ansible files]# ls
    10. 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

    1. [root@ansible files]# cd ../templates/
    2. [root@ansible templates]# vim nginx.conf.j2
    3. #user nobody;
    4. worker_processes 1;
    5. #error_log logs/error.log;
    6. #error_log logs/error.log notice;
    7. #error_log logs/error.log info;
    8. #pid logs/nginx.pid;
    9. events {
    10. worker_connections 1024;
    11. }
    12. http {
    13. include mime.types;
    14. default_type application/octet-stream;
    15. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    16. # '$status $body_bytes_sent "$http_referer" '
    17. # '"$http_user_agent" "$http_x_forwarded_for"';
    18. #access_log logs/access.log main;
    19. sendfile on;
    20. #tcp_nopush on;
    21. #keepalive_timeout 0;
    22. keepalive_timeout 65;
    23. #gzip on;
    24. server {
    25. listen 80;
    26. server_name localhost;
    27. charset utf-8;
    28. #access_log logs/host.access.log main;
    29. location / {
    30. root html;
    31. index index.html index.php;
    32. }
    33. #error_page 404 /404.html;
    34. # redirect server error pages to the static page /50x.html
    35. #
    36. error_page 500 502 503 504 /50x.html;
    37. location = /50x.html {
    38. root html;
    39. }
    40. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    41. #
    42. #location ~ \.php$ {
    43. # proxy_pass http://127.0.0.1;
    44. #}
    45. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    46. #
    47. location ~ \.php$ {
    48. root html;
    49. fastcgi_pass {{php_server_ip}}:9000;
    50. fastcgi_index index.php;
    51. fastcgi_param SCRIPT_FILENAME {{nginx_html_path}}$fastcgi_script_name;
    52. include fastcgi_params;
    53. }
    54. # deny access to .htaccess files, if Apache's document root
    55. # concurs with nginx's one
    56. #
    57. #location ~ /\.ht {
    58. # deny all;
    59. #}
    60. }
    61. # another virtual host using mix of IP-, name-, and port-based configuration
    62. #
    63. #server {
    64. # listen 8000;
    65. # listen somename:8080;
    66. # server_name somename alias another.alias;
    67. # location / {
    68. # root html;
    69. # index index.html index.htm;
    70. # }
    71. #}
    72. # HTTPS server
    73. #
    74. #server {
    75. # listen 443 ssl;
    76. # server_name localhost;
    77. # ssl_certificate cert.pem;
    78. # ssl_certificate_key cert.key;
    79. # ssl_session_cache shared:SSL:1m;
    80. # ssl_session_timeout 5m;
    81. # ssl_ciphers HIGH:!aNULL:!MD5;
    82. # ssl_prefer_server_ciphers on;
    83. # location / {
    84. # root html;
    85. # index index.html index.htm;
    86. # }
    87. #}
    88. }

    2.3 编写 nginx 模块 task 任务文件

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

    1. [root@ansible templates]# cd ../tasks/
    2. [root@ansible tasks]# vim main.yml
    3. - name: copy nginx package
    4. copy: src=/etc/ansible/roles/nginx/files/nginx-1.24.0.tar.gz dest=/opt
    5. - name: copy wordpress package
    6. copy: src=/etc/ansible/roles/nginx/files/Discuz_X3.4_SC_UTF8.zip dest=/opt
    7. - name: copy Discuz package
    8. copy: src=/etc/ansible/roles/nginx/files/wordpress-4.9.4-zh_CN.tar.gz dest=/opt
    9. - name: install nginx shell
    10. script: /etc/ansible/roles/nginx/files/lnmp.sh nginx
    11. - name: copy conf.j2
    12. template: src=/etc/ansible/roles/nginx/templates/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf owner=nginx group=nginx
    13. - name: nfs shell
    14. script: /etc/ansible/roles/nginx/files/nginx_nfs.sh
    15. - name: start nginx service
    16. service: enabled=true name=nginx state=started

    3. 编写 mysql 模块

    3.1 准备 files 相关文件

    3.1.1 准备 mysql 安装包
    1. [root@ansible tasks]# cd ../../mysql/files/
    2. [root@ansible files]# ls
    3. 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 创建共享目录脚本
    1. [root@ansible files]# vim mysql_nfs.sh
    2. #!/bin/bash
    3. echo "/usr/local/mysql *(rw)" > /etc/exports
    4. chmod -R 777 /usr/local/mysql/
    5. systemctl start rpcbind
    6. systemctl start nfs

    3.2 编写 mysql 模块 task 任务文件

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

    1. [root@ansible files]# cd ../tasks/
    2. [root@ansible tasks]# vim main.yml
    3. - name: copy package
    4. copy: src=/etc/ansible/roles/mysql/files/mysql-boost-5.7.20.tar.gz dest=/opt/
    5. - name: install mysql shell
    6. script: /etc/ansible/roles/mysql/files/lnmp.sh mysql
    7. - name: nfs shell
    8. script: /etc/ansible/roles/mysql/files/mysql_nfs.sh

    4. 编写 php 模块

    4.1 准备 files 相关文件

    4.1.1 准备 php 安装包
    1. [root@ansible vars]# cd ../../php/files/
    2. [root@ansible files]# ls
    3. 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 主配置文件
    1. [root@ansible files]# egrep -v "^;" php.ini | egrep -v "^$"
    2. [PHP]
    3. engine = On
    4. short_open_tag = Off
    5. precision = 14
    6. output_buffering = 4096
    7. zlib.output_compression = Off
    8. implicit_flush = Off
    9. unserialize_callback_func =
    10. serialize_precision = -1
    11. disable_functions =
    12. disable_classes =
    13. zend.enable_gc = On
    14. expose_php = On
    15. max_execution_time = 30
    16. max_input_time = 60
    17. memory_limit = 128M
    18. error_reporting = E_ALL
    19. display_errors = On
    20. display_startup_errors = On
    21. log_errors = On
    22. log_errors_max_len = 1024
    23. ignore_repeated_errors = Off
    24. ignore_repeated_source = Off
    25. report_memleaks = On
    26. track_errors = On
    27. html_errors = On
    28. variables_order = "GPCS"
    29. request_order = "GP"
    30. register_argc_argv = Off
    31. auto_globals_jit = On
    32. post_max_size = 8M
    33. auto_prepend_file =
    34. auto_append_file =
    35. default_mimetype = "text/html"
    36. default_charset = "UTF-8"
    37. doc_root =
    38. user_dir =
    39. enable_dl = Off
    40. file_uploads = On
    41. upload_max_filesize = 2M
    42. max_file_uploads = 20
    43. allow_url_fopen = On
    44. allow_url_include = Off
    45. default_socket_timeout = 60
    46. [CLI Server]
    47. cli_server.color = On
    48. [Date]
    49. date.timezone = Asia/Shanghai
    50. [filter]
    51. [iconv]
    52. [intl]
    53. [sqlite3]
    54. [Pcre]
    55. [Pdo]
    56. [Pdo_mysql]
    57. pdo_mysql.cache_size = 2000
    58. pdo_mysql.default_socket=
    59. [Phar]
    60. [mail function]
    61. SMTP = localhost
    62. smtp_port = 25
    63. mail.add_x_header = On
    64. [SQL]
    65. sql.safe_mode = Off
    66. [ODBC]
    67. odbc.allow_persistent = On
    68. odbc.check_persistent = On
    69. odbc.max_persistent = -1
    70. odbc.max_links = -1
    71. odbc.defaultlrl = 4096
    72. odbc.defaultbinmode = 1
    73. [Interbase]
    74. ibase.allow_persistent = 1
    75. ibase.max_persistent = -1
    76. ibase.max_links = -1
    77. ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
    78. ibase.dateformat = "%Y-%m-%d"
    79. ibase.timeformat = "%H:%M:%S"
    80. [MySQLi]
    81. mysqli.max_persistent = -1
    82. mysqli.allow_persistent = On
    83. mysqli.max_links = -1
    84. mysqli.cache_size = 2000
    85. mysqli.default_port = 3306
    86. mysqli.default_socket = /usr/local/mysql/mysql.sock
    87. mysqli.default_host =
    88. mysqli.default_user =
    89. mysqli.default_pw =
    90. mysqli.reconnect = Off
    91. [mysqlnd]
    92. mysqlnd.collect_statistics = On
    93. mysqlnd.collect_memory_statistics = On
    94. [OCI8]
    95. [PostgreSQL]
    96. pgsql.allow_persistent = On
    97. pgsql.auto_reset_persistent = Off
    98. pgsql.max_persistent = -1
    99. pgsql.max_links = -1
    100. pgsql.ignore_notice = 0
    101. pgsql.log_notice = 0
    102. [bcmath]
    103. bcmath.scale = 0
    104. [browscap]
    105. [Session]
    106. session.save_handler = files
    107. session.use_strict_mode = 0
    108. session.use_cookies = 1
    109. session.use_only_cookies = 1
    110. session.name = PHPSESSID
    111. session.auto_start = 0
    112. session.cookie_lifetime = 0
    113. session.cookie_path = /
    114. session.cookie_domain =
    115. session.cookie_httponly =
    116. session.serialize_handler = php
    117. session.gc_probability = 1
    118. session.gc_divisor = 1000
    119. session.gc_maxlifetime = 1440
    120. session.referer_check =
    121. session.cache_limiter = nocache
    122. session.cache_expire = 180
    123. session.use_trans_sid = 0
    124. session.sid_length = 26
    125. session.trans_sid_tags = "a=href,area=href,frame=src,form="
    126. session.sid_bits_per_character = 5
    127. [Assertion]
    128. zend.assertions = 1
    129. [COM]
    130. [mbstring]
    131. [gd]
    132. [exif]
    133. [Tidy]
    134. tidy.clean_output = Off
    135. [soap]
    136. soap.wsdl_cache_enabled=1
    137. soap.wsdl_cache_dir="/tmp"
    138. soap.wsdl_cache_ttl=86400
    139. soap.wsdl_cache_limit = 5
    140. [sysvshm]
    141. [ldap]
    142. ldap.max_links = -1
    143. [mcrypt]
    144. [dba]
    145. [opcache]
    146. [curl]
    147. [openssl]
    4.1.4 编辑 php-fpm 主配置文件
    1. [root@ansible files]# egrep -v "^;" php-fpm.conf | egrep -v "^$"
    2. [global]
    3. pid = run/php-fpm.pid
    4. include=/usr/local/php/etc/php-fpm.d/*.conf
    4.1.5 编辑 php-fpm 进程池配置文件

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

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

    4.2 准备 templates 相关文件

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

    4.3 编写 php 模块 task 任务文件

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

    1. [root@ansible templates]# cd ../tasks/
    2. [root@ansible tasks]# vim main.yml
    3. - name: copy package
    4. copy: src=/etc/ansible/roles/php/files/php-7.1.10.tar.bz2 dest=/opt/
    5. - name: create mysql nfs path
    6. file: path=/usr/local/mysql/ state=directory
    7. - name: create nginx nfs path
    8. file: path=/usr/local/nginx/html/ state=directory
    9. - name: mount nfs mysql share
    10. ansible.builtin.mount: src=192.168.190.105:/usr/local/mysql path=/usr/local/mysql fstype=nfs opts=defaults state=mounted
    11. - name: mount nfs nginx share
    12. ansible.builtin.mount: src=192.168.190.104:/usr/local/nginx/html path=/usr/local/nginx/html fstype=nfs opts=defaults state=mounted
    13. - name: install php shell
    14. script: /etc/ansible/roles/php/files/lnmp.sh php
    15. - name: copy php-fpm.conf
    16. copy: src=/etc/ansible/roles/php/files/php-fpm.conf dest=/usr/local/php/etc/php-fpm.conf
    17. - name: copy php.ini
    18. copy: src=/etc/ansible/roles/php/files/php.ini dest=/usr/local/php/lib/php.ini
    19. - name: copy www.conf
    20. template: src=/etc/ansible/roles/php/templates/www.conf.j2 dest=/usr/local/php/etc/php-fpm.d/www.conf
    21. - name: start php-fpm server
    22. service: name=php-fpm state=started

    5. 编写 roles 示例

    1. [root@ansible vars]# cd /etc/ansible/
    2. [root@ansible ansible]# vim lnmp.yml
    3. ---
    4. - hosts: nginx
    5. remote_user: root
    6. roles:
    7. - nginx
    8. - hosts: mysql
    9. remote_user: root
    10. roles:
    11. - mysql
    12. - hosts: php
    13. remote_user: root
    14. roles:
    15. - php
    16. ...

    三、执行角色剧本并验证

    1. 查看目录

    1. [root@ansible ansible]# ls
    2. ansible.cfg hosts lnmp.yml roles
    3. [root@ansible ansible]# tree
    4. .
    5. ├── ansible.cfg
    6. ├── hosts
    7. ├── lnmp.yml
    8. └── roles
    9. ├── mysql
    10. │   ├── defaults
    11. │   │   └── main.yml
    12. │   ├── files
    13. │   │   ├── lnmp.sh
    14. │   │   ├── mysql-boost-5.7.20.tar.gz
    15. │   │   └── mysql_nfs.sh
    16. │   ├── handlers
    17. │   │   └── main.yml
    18. │   ├── meta
    19. │   │   └── main.yml
    20. │   ├── tasks
    21. │   │   └── main.yml
    22. │   ├── templates
    23. │   └── vars
    24. │   └── main.yml
    25. ├── nginx
    26. │   ├── defaults
    27. │   │   └── main.yml
    28. │   ├── files
    29. │   │   ├── Discuz_X3.4_SC_UTF8.zip
    30. │   │   ├── lnmp.sh
    31. │   │   ├── nginx-1.24.0.tar.gz
    32. │   │   ├── nginx_nfs.sh
    33. │   │   └── wordpress-4.9.4-zh_CN.tar.gz
    34. │   ├── handlers
    35. │   │   └── main.yml
    36. │   ├── meta
    37. │   │   └── main.yml
    38. │   ├── tasks
    39. │   │   └── main.yml
    40. │   ├── templates
    41. │   │   └── nginx.conf.j2
    42. │   └── vars
    43. │   └── main.yml
    44. └── php
    45. ├── defaults
    46. │   └── main.yml
    47. ├── files
    48. │   ├── lnmp.sh
    49. │   ├── php-7.1.10.tar.bz2
    50. │   ├── php-fpm.conf
    51. │   ├── php.ini
    52. │   └── www.conf
    53. ├── handlers
    54. │   └── main.yml
    55. ├── meta
    56. │   └── main.yml
    57. ├── tasks
    58. │   └── main.yml
    59. ├── templates
    60. │   └── www.conf.j2
    61. └── vars
    62. └── main.yml

    2. 执行剧本

    1. [root@ansible ansible]# ansible-playbook lnmp.yml
    2. PLAY [nginx] **************************************************************************************
    3. TASK [Gathering Facts] ****************************************************************************
    4. ok: [192.168.190.104]
    5. TASK [copy nginx package] *************************************************************************
    6. changed: [192.168.190.104]
    7. TASK [nginx : copy wordpress package] *************************************************************
    8. changed: [192.168.190.104]
    9. TASK [nginx : copy Discuz dpackage] ***************************************************************
    10. changed: [192.168.190.104]
    11. TASK [install nginx shell] ************************************************************************
    12. changed: [192.168.190.104]
    13. TASK [nginx : copy conf.j2] ***********************************************************************
    14. changed: [192.168.190.104]
    15. TASK [nginx : nfs shell] **************************************************************************
    16. changed: [192.168.190.104]
    17. TASK [start nginx service] ************************************************************************
    18. changed: [192.168.190.104]
    19. PLAY [mysql] **************************************************************************************
    20. TASK [Gathering Facts] ****************************************************************************
    21. ok: [192.168.190.105]
    22. TASK [mysql : copy package] ***********************************************************************
    23. changed: [192.168.190.105]
    24. TASK [install mysql shell] ******************************************************************************
    25. changed: [192.168.190.105]
    26. TASK [mysql : nfs shell] **************************************************************************
    27. changed: [192.168.190.105]
    28. PLAY [php] ****************************************************************************************
    29. TASK [Gathering Facts] ****************************************************************************
    30. ok: [192.168.190.106]
    31. TASK [php : copy package] *************************************************************************
    32. changed: [192.168.190.106]
    33. TASK [php : create mysql nfs path] ****************************************************************
    34. changed: [192.168.190.106]
    35. TASK [php : create nginx nfs path] ****************************************************************
    36. changed: [192.168.190.106]
    37. TASK [php : mount nfs mysql share] ****************************************************************
    38. changed: [192.168.190.106]
    39. TASK [php : mount nfs nginx share] ****************************************************************
    40. changed: [192.168.190.106]
    41. TASK [install php shell] ********************************************************************************
    42. changed: [192.168.190.106]
    43. TASK [copy php-fpm.conf] **************************************************************************
    44. changed: [192.168.190.106]
    45. TASK [copy php.ini] *******************************************************************************
    46. changed: [192.168.190.106]
    47. TASK [php : copy www.conf] ************************************************************************
    48. changed: [192.168.190.106]
    49. TASK [start php-fpm server] ***********************************************************************
    50. changed: [192.168.190.106]
    51. PLAY RECAP ****************************************************************************************
    52. 192.168.190.104 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    53. 192.168.190.105 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    54. 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

    1. [root@nginx ~]# cd /usr/local/nginx/html/wordpress
    2. [root@nginx wordpress]# cp wp-config-sample.php wp-config.php
    3. [root@nginx wordpress]# vim wp-config.php
    4. // ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
    5. /** WordPress数据库的名称 */
    6. define('DB_NAME', 'wordpress');
    7. /** MySQL数据库用户名 */
    8. define('DB_USER', 'wordpress');
    9. /** MySQL数据库密码 */
    10. define('DB_PASSWORD', '123456');
    11. /** MySQL主机 */
    12. 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

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

    4.2 浏览器访问 Discuz

    访问192.168.190.104/bbs/install/index.php

  • 相关阅读:
    Tailwindcss 提取组件
    JVM参数MetaspaceSize的解读
    Angular-Web前端框架
    chrome浏览器也能做自动化测试
    四大函数式接口(重点,必须掌握)
    《向量数据库指南》——宏观解读向量数据库Milvus Cloud
    websocket flv 客户端解封包
    PTC自恢复保险丝应用和选型
    join(),Java内存图
    Ubuntu使用过程中的常见问题及解决方案
  • 原文地址:https://blog.csdn.net/qq_64612585/article/details/138748513