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

news2024/11/26 14:47:34

 前言

本文将介绍如何使用 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 0

cat << 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.27
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  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 

生成 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 = 1
 
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
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/null
		
echo   "正在创建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 package
  copy: src=/etc/ansible/roles/nginx/files/nginx-1.24.0.tar.gz dest=/opt
- name: copy wordpress package
  copy: src=/etc/ansible/roles/nginx/files/Discuz_X3.4_SC_UTF8.zip dest=/opt
- name: copy Discuz package
  copy: src=/etc/ansible/roles/nginx/files/wordpress-4.9.4-zh_CN.tar.gz dest=/opt
- name: install nginx shell
  script: /etc/ansible/roles/nginx/files/lnmp.sh nginx
- name: copy conf.j2
  template: src=/etc/ansible/roles/nginx/templates/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf owner=nginx group=nginx
- name: nfs shell
  script: /etc/ansible/roles/nginx/files/nginx_nfs.sh
- name: start nginx service
  service: 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 package
  copy: src=/etc/ansible/roles/mysql/files/mysql-boost-5.7.20.tar.gz dest=/opt/
- name: install mysql shell
  script: /etc/ansible/roles/mysql/files/lnmp.sh mysql
- name: nfs shell
  script: /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 package
  copy: src=/etc/ansible/roles/php/files/php-7.1.10.tar.bz2 dest=/opt/
- name: create mysql nfs path
  file: path=/usr/local/mysql/ state=directory
- name: create nginx nfs path
  file: path=/usr/local/nginx/html/ state=directory
- name: mount nfs mysql share
  ansible.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 shell
  script: /etc/ansible/roles/php/files/lnmp.sh php
- name: copy php-fpm.conf
  copy: src=/etc/ansible/roles/php/files/php-fpm.conf dest=/usr/local/php/etc/php-fpm.conf
- name: copy php.ini
  copy: src=/etc/ansible/roles/php/files/php.ini dest=/usr/local/php/lib/php.ini
- name: copy www.conf
  template: src=/etc/ansible/roles/php/templates/www.conf.j2 dest=/usr/local/php/etc/php-fpm.d/www.conf
- name: start php-fpm server
  service: name=php-fpm state=started

5. 编写 roles 示例

[root@ansible vars]# cd /etc/ansible/
[root@ansible ansible]# vim lnmp.yml
---
- hosts: nginx
  remote_user: root
  roles:
     - nginx
- hosts: mysql
  remote_user: root
  roles:
     - mysql
- hosts: php
  remote_user: root
  roles:
     - 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.yml

PLAY [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.coloradmin.cn/o/1669184.html

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

相关文章

[数据集][目标检测]电力场景安全帽检测数据集VOC+YOLO格式295张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;295 标注数量(xml文件个数)&#xff1a;295 标注数量(txt文件个数)&#xff1a;295 标注类别…

Web自动化 - selenium

文章目录 一、selenium的使用selenium的安装 二、元素1. 定位选择元素1.id 定位2. class_name 定位find_element 和 find_elements的区别3. TAG_NAME 定位4. 超链接 定位 2. 操控元素1. 查询内容2. 获取元素文本内容3. 获取元素属性 3. 浏览器常用操作API4. 鼠标操作 - perform…

微信小程序 17:小程序使用 npm 包和组件应用

目前&#xff0c;小程序中已经支持实用 npm 安装第三方包&#xff0c;从而提高小程序的开发效率&#xff0c;但是在小程序中使用 npm 包有三个限制&#xff1a; 不支持 Node.js内置库的包不支持依赖于浏览器内置对象的包不支持依赖于 C插件的包 Vant Weapp Vant Weapp是有赞…

合专家模型 (MoE) 详解

本文转载自&#xff1a;混合专家模型 (MoE) 详解 https://huggingface.co/blog/zh/moe 英文版&#xff1a;https://huggingface.co/blog/moe 文章目录 一、简短总结二、什么是混合专家模型&#xff1f;三、混合专家模型简史四、什么是稀疏性?五、混合专家模型中令牌的负载均衡…

战火重燃!全球仓储机器人内卷大盘点~

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 随着全球经济的持续发展和电子商务的迅速崛起&#xff0c;仓储和物流行业正面临着前所未有的挑战与机遇。 在这个背…

LeetCode 题目 121:买卖股票的最佳时机

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

【C语言项目】贪吃蛇(下)

个人主页~ 源码在Gitee仓库~ 上一篇贪吃蛇&#xff08;上&#xff09;~ 贪吃蛇 四、核心的实现游戏测试1、GameStart&#xff08;1&#xff09;控制台窗口大小和名字设置&#xff08;2&#xff09;光标隐藏&#xff08;3&#xff09;打印欢迎界面&#xff08;4&#xff09;创建…

18 【Aseprite 作图】工具栏介绍

1 在没有输入法的情况下&#xff0c; 按住Shift 大写的N&#xff0c;就可以快速新建图层 ctrl z 撤回这个图层 2 双击图层&#xff0c;可以修改图层名称和属性 3 按住图层&#xff0c;拖动图层&#xff0c;可以把图层拉到 组&#xff0c;就可以方便一组一组管理图层 4 保存的…

Windows Docker 使用 httpd 部署静态 Web 站点

一、简介 httpd 是 Apache超文本传输协议&#xff08;HTTP&#xff09;服务器的主程序&#xff0c;是一个独立运行的后台进程&#xff0c;专门负责处理 HTTP 请求。它通过建立子进程或线程的池来高效管理请求&#xff0c;确保服务器能够迅速响应客户端的需求。httpd 因其高效率…

创新案例|为何农夫山泉创新战略升级为一家零售科技公司

农夫山泉上市的消息被公之于众后&#xff0c;几乎所有人都将目光投向了这家国内家喻户晓的饮料公司&#xff0c;谁都想第一时间内窥探它的庐山真面目。 当然&#xff0c;在此之前已经有多路消息通过旁敲侧击&#xff0c;从管窥中获取了一些农夫山泉的真实数据。 去年6月&…

全面了解 LLM 微调——根据应用场景独特需求定制大型语言模型

1.概述 截至2023年&#xff0c;大型语言模型&#xff08;LLM&#xff09;的发展确实在不断进步&#xff0c;涌现出了多种新的模型&#xff0c;如ChatGLM、Alpaca、Falcon以及Llama 2&#xff0c;还有GPT-4等。这些模型在自然语言处理领域展现出了强大的潜力&#xff0c;它们能…

Zookeeper 注册中心:单机部署

序言 本文给大家介绍 Zookeeper 单机部署流程、 如何与 Spring 整合使用。除此之外&#xff0c;还有 Zookeeper 作为注册中心与 SpringCloud 的整合流程。 一、部署流程 官网下载 Zookeeper 安装包 解压安装包到指定目录 进入 apache-zookeeper-3.8.4-bin/conf 目录&…

最大子矩阵:前缀和、动态规划

最近在学习动态规划&#xff0c;在牛客上刷题时碰到了这一题。其实最初的想法是暴力和前缀和&#xff0c;但是时间复杂度极高&#xff0c;需要套4层循环。后来去网上搜了一下相关的题解和做法&#xff0c;进而了解到了前缀和&#xff0b;线性动态规划的做法。但是在成功做出这题…

富阳区石弹村全景图-没拍到景点内容

- - - 石梯山庄旁停车场拍摄 建议雨后去 整个山到处都是消息 整座山都在渗水

Python 编程语言中的 None 到底是什么?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 让我们一起深入了解 Python 中的 None。 什么是 None&#xff1f; 在 Python 编程语言中&#xff0c;None 是一个特殊的常量&#xff0c;它代表了 “无” 或 “没有值”。你可以把它想象成一个空盒子…

Redis-详解(基础)

文章目录 什么是Redis&#xff1f;用Redis的特点&#xff1f;用Redis可以实现哪些功能&#xff1f;Redis的常用数据类型有哪些?Redis的常用框架有哪些?本篇小结 更多相关内容可查看 什么是Redis&#xff1f; Redis&#xff08;Remote DictionaryServer&#xff09;是一个开源…

数据结构与算法===回溯法

文章目录 原理使用场景括号生成代码 小结 原理 回溯法是采用试错的思想&#xff0c;它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#x…

NodeMCU ESP8266 获取I2C从机地址

文章目录 前言关于地址位读写位程序总结前言 I2C总线上可以挂载很多的从设备,每个设备都会有一个自己唯一的一个地址; 关于地址位 通常地址位占7位数据,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址; 读写位 该位…

Github学习

1.Git与Github 区别: Git是一个分布式版本控制系统&#xff0c;简单的说就是一个软件&#xff0c;用于记录一个或若干个文件内容变化&#xff0c;以便将来查阅特点版本修订情况的软件。 Github是一个为用户提高Git服务的网站&#xff0c;简单说就是一个可以放代码的地方。Gi…

摩苏尔大坝形变监测

摩苏尔大坝&#xff0c;是伊拉克最大的大坝。它位于底格里斯河35公里&#xff0c;北距摩苏尔市&#xff0c;这是一座粘土质地的水坝&#xff0c;高113米&#xff0c;长3.2公里&#xff0c;于1986落成。 大坝建成后不久&#xff0c;大坝就遇到了由软石膏地基造成的一些结构性问题…