WordPress (LNMP 架构) 一键部署 Playbook
采用 LNMP 架构组件组合:
- Linux:CentOS 7 操作系统作为基础环境
- Nginx:高性能 Web 服务器,处理 HTTP 请求并解析 PHP
- MariaDB:关系型数据库,存储 WordPress 应用数据
- PHP-FPM:PHP 进程管理器,处理动态脚本执行
第一部分:deploy lnmp
(部署 LNMP 基础环境)
- name: deploy lnmp # Play 名称:部署 LNMP 环境
hosts: lnmp # 目标主机组:lnmp(在 inventory 中定义的主机)
vars: # 变量定义区,后续任务可引用这些变量
mysql_root_password: '123' # MariaDB root 用户密码
app_host: "localhost" # 数据库应用用户允许访问的主机(本地)
app_user: 'yy' # 应用使用的数据库用户名
app_password: '123' # 应用数据库用户的密码
app_priv: "{{ db_name }}.*:ALL" # 应用用户的数据库权限(对 db_name 数据库的所有表有全部权限)
db_name: webapp # 应用使用的数据库名称
tasks: # 任务列表:具体部署步骤
任务 1:安装 MariaDB 及相关依赖
- name: install mariadb # 任务名称:安装 MariaDB 相关包
yum: # 使用 yum 模块(适用于 RHEL/CentOS 系统)
name: # 要安装的包列表
- mariadb-server # MariaDB 服务端
- python2-PyMySQL # Python 连接 MySQL 的库(供 Ansible 模块使用)
state: present # 确保包已安装(若未安装则安装)
任务 2:启动并启用 MariaDB 服务
- name: start mariadb # 任务名称:启动 MariaDB 服务
service: # 使用 service 模块管理系统服务
name: mariadb # 服务名称:mariadb
state: started # 状态:启动(若未运行则启动)
enabled: yes # 开机自启:启用
任务 3:设置 MariaDB root@localhost 密码(初始设置)
- name: set root@localhost password # 任务名称:设置 root@localhost 密码
shell: mysqladmin password '{{ mysql_root_password }}' # 执行 shell 命令:用 mysqladmin 设置 root 密码
ignore_errors: yes # 忽略错误(若密码已设置,再次执行会报错,此处忽略以继续后续任务)
任务 4:为不同主机设置 root 密码(完善密码配置)
- name: set root password # 任务名称:为不同主机设置 root 密码
mysql_user: # 使用 mysql_user 模块管理数据库用户
name: root # 用户名:root
password: "{{ mysql_root_password }}" # 密码:引用变量中的 root 密码
host: "{{ item }}" # 允许登录的主机:循环中的每个值(见下方 with_items)
state: present # 确保用户存在
login_user: root # 执行操作时的登录用户:root
login_password: "{{ mysql_root_password }}" # 登录密码:引用 root 密码
with_items: # 循环:对以下主机分别设置
- "{{ ansible_fqdn }}" # 主机的完全限定域名(如 node1.example.com)
- 127.0.0.1 # IPv4 本地回环地址
- ::1 # IPv6 本地回环地址
作用:确保 root 用户可以从本地、FQDN 等地址登录,统一密码
任务 5:创建应用数据库用户
- name: create user{{ user }} # 任务名称:创建应用数据库用户(注:变量名应为 app_user,可能笔误)
mysql_user: # 使用 mysql_user 模块
name: '{{ app_user }}' # 用户名:引用 app_user 变量(yy)
password: '{{ app_password }}' # 密码:引用 app_password 变量(123)
priv: "{{ app_priv }}" # 权限:引用 app_priv 变量(webapp.*:ALL)
host: '{{ app_host }}' # 允许登录的主机:引用 app_host 变量(localhost)
state: present # 确保用户存在
login_user: root # 登录用户:root
login_password: "{{ mysql_root_password }}" # 登录密码:root 密码
任务 6:创建应用数据库
- name: create database db_name # 任务名称:创建应用数据库
mysql_db: # 使用 mysql_db 模块管理数据库
name: "{{ db_name }}" # 数据库名:引用 db_name 变量(webapp)
state: present # 确保数据库存在
login_user: root # 登录用户:root
login_password: "{{ mysql_root_password }}" # 登录密码:root 密码
任务 7:安装 Nginx
- name: install nginx # 任务名称:安装 Nginx
yum: # 使用 yum 模块
name: nginx # 包名:nginx
state: present # 确保安装
任务 8:启动并启用 Nginx 服务
- name: start nginx # 任务名称:启动 Nginx 服务
service: # 使用 service 模块
name: nginx # 服务名:nginx
state: started # 状态:启动
enabled: yes # 开机自启:启用
任务 9:准备 Nginx 默认页面(存在路径笔误)
- name: prepare file # 任务名称:准备文件(默认首页)
copy: # 使用 copy 模块创建文件
content: from nginx # 文件内容:字符串 "from nginx"
dest: /user/share/nginx/html/index.html # 目标路径(注:路径有误,应为 /usr/share/nginx/html/index.html)
任务 10:安装 PHP 及相关组件
- name: install php # 任务名称:安装 PHP 相关包
yum: # 使用 yum 模块
name: php,php-fpm,php-mysqlnd # 包列表:PHP 解释器、PHP-FPM 进程管理器、PHP 连接 MySQL 的扩展
state: present # 确保安装
任务 11:修改 PHP-FPM 运行用户 / 组
- name: modify running user for php # 任务名称:修改 PHP-FPM 的运行用户和组
lineinfile: # 使用 lineinfile 模块修改配置文件
path: /etc/php-fpm.d/www.conf # 目标配置文件路径
regexp: "{{ item}} = " # 匹配行的正则:以 "user = " 或 "group = " 开头的行
line: "{{ item }} = nginx" # 替换后的行:将用户/组改为 nginx
loop: # 循环:分别处理 user 和 group
- user
- group
作用:让 PHP-FPM 与 Nginx 使用相同的用户(nginx),避免文件权限问题
任务 12:启动并启用 PHP-FPM 服务
- name: start php-fpm.service # 任务名称:启动 PHP-FPM 服务
service: # 使用 service 模块
name: php-fpm # 服务名:php-fpm
state: started # 状态:启动
enabled: yes # 开机自启:启用
任务 13:配置 Nginx 支持 PHP
- name: config php for nginx # 任务名称:配置 Nginx 处理 PHP 请求
copy: # 使用 copy 模块复制配置文件
src: php.conf # 本地源文件:php.conf(需在 Ansible 控制节点的指定路径)
dest: /etc/nginx/default.d/php.conf # 目标路径:Nginx 默认配置目录下的 php.conf
作用:添加 Nginx 解析 PHP 的规则(如将 .php 请求转发给 PHP-FPM 处理)
任务 14:重启 Nginx 使配置生效
- name: restarted nginx # 任务名称:重启 Nginx
service: # 使用 service 模块
name: nginx # 服务名:nginx
state: restarted # 状态:重启(使新配置生效)
第二部分:deploy web app
(部署 Web 应用:WordPress)
- name: deploy web app # Play 名称:部署 Web 应用
hosts: lnmp # 目标主机组:仍为 lnmp(与上一个 play 相同)
vars: # 变量定义:应用相关配置
blog_vhost: blog.yy.cloud # WordPress 虚拟主机域名
tasks: # 任务列表:部署步骤
任务 1:准备 WordPress 虚拟主机配置
- name: prepare vhost for wordpress # 任务名称:准备 WordPress 的虚拟主机配置
template: # 使用 template 模块(支持变量替换)
src: vhost-wordpress.conf.j2 # 本地模板文件:vhost-wordpress.conf.j2(含变量,如 {{ blog_vhost }})
dest: /etc/nginx/conf.d/vhost-wordpress.conf # 目标路径:Nginx 虚拟主机配置文件
作用:生成针对 WordPress 的 Nginx 虚拟主机配置(如域名、根目录、PHP 解析规则等)
任务 2:创建 WordPress 网站根目录
- name: create /usr/share/nginx/html/{{ blog_vhost }} # 任务名称:创建网站根目录
file: # 使用 file 模块
path: /usr/share/nginx/html/{{ blog_vhost }} # 路径:引用 blog_vhost 变量(如 /usr/share/nginx/html/blog.yy.cloud)
state: directory # 确保为目录(不存在则创建)
任务 3:解压 WordPress 程序包
- name: Unarchive a wordpress file # 任务名称:解压 WordPress 文件
unarchive: # 使用 unarchive 模块解压文件
src: wordpress-4.9.4-zh_CN.zip # 本地源文件:WordPress 压缩包(需在控制节点)
dest: /usr/share/nginx/html/{{ blog_vhost }}/ # 解压目标目录:网站根目录
owner: nginx # 解压后文件的所有者:nginx
group: nginx # 解压后文件的所属组:nginx
作用:将 WordPress 程序部署到网站根目录,并设置正确权限
任务 4:重启 Nginx 使虚拟主机配置生效
- name: restart nginx # 任务名称:重启 Nginx
service: # 使用 service 模块
name: nginx # 服务名:nginx
state: restarted # 状态:重启
总结
整个 Playbook 分两阶段完成部署:
- 先安装并配置 LNMP 基础环境(MariaDB、Nginx、PHP),包括数据库用户 / 库创建、服务启动等;
- 再部署 WordPress 应用,通过虚拟主机配置、程序解压等步骤使应用可用。
1. 准备项目目录
mkdir blog && cd blog
cat > ansible.cfg <<'EOF'
[defaults]
remote_user = laoma
inventory = ./inventory
vault_password_file=./secret.txt
[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOF
cat > inventory <<'EOF'
blog ansible_host=10.1.8.100
EOF
准备虚拟站点模版
cat > vhost-wordpress.conf.j2 <<EOF
server {
listen 80;
server_name {{ blog_vhost }};
root {{wp_install_dir }};
index index.php index.html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
# log file
access_log /var/log/nginx/access-{{ blog_vhost }}.log;
error_log /var/log/nginx/error-{{ blog_vhost }}.log;
}
EOF
配置nginx对接php
cat > php.conf <<'EOF'
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
EOF