WordPress 一键部署 Playbook - 角色化版本 - 开发手册
一、手册概述
本手册旨在说明基于 Ansible 角色(Role)架构的 WordPress 自动化部署方案。该方案在原有 LNMP(Linux+Nginx+MariaDB+PHP)架构基础上,通过角色化设计进一步提升代码复用性、可维护性和扩展性,支持 CentOS 7 操作系统,实现企业级博客平台的标准化部署与安全加固。
角色化设计将原有的模块化 Playbook 重构为独立角色,每个组件(如数据库、Web 服务等)封装为角色,便于团队协作和跨项目复用。
二、整体架构与角色设计
1. 技术架构
沿用 LNMP 架构:
- Linux:CentOS 7 操作系统
- Nginx:Web 服务器,处理 HTTP 请求
- MariaDB:数据库服务,存储 WordPress 数据
- PHP-FPM:PHP 进程管理器,解析动态脚本
2. 角色划分
将部署流程拆分为 5 个独立角色,每个角色负责特定功能:
mariadb
:数据库部署与安全初始化php
:PHP 及扩展组件部署nginx
:Nginx 服务部署与配置wordpress
:WordPress 应用部署security_wordpress
:系统安全加固
3. 设计原则
- 角色内聚:每个角色专注于单一功能模块
- 变量分离:角色级变量与全局变量分离,支持灵活配置
- 幂等性:所有任务支持重复执行,避免副作用
- 可扩展性:支持通过角色参数调整配置,适应不同环境
三、项目结构设计
# 项目目录结构
blog/
├── ansible.cfg # Ansible 配置文件
├── inventory # 主机清单
├── secret.txt # vault 密码文件
├── deploy_blog.yml # 主 Playbook
├── group_vars/ # 全局变量
│ ├── all/
│ │ └── vars.yml # 所有主机共享变量
│ ├── databases/
│ │ └── db.yml # 数据库相关变量(加密)
│ └── wordpress/
│ └── vars.yml # WordPress 相关变量
└── roles/ # 角色目录
├── mariadb/ # 数据库角色
│ ├── tasks/
│ │ └── main.yml # 数据库部署任务
├── php/ # PHP 角色
│ ├── tasks/
│ │ └── main.yml # PHP 部署任务
├── nginx/ # Nginx 角色
│ ├── tasks/
│ │ └── main.yml # Nginx 部署任务
│ ├── files/
│ │ └── php.conf # Nginx-PHP 配置文件
│ └── templates/
│ └── wordpress.conf.j2 # 虚拟主机模板
├── wordpress/ # WordPress 角色
│ ├── tasks/
│ │ └── main.yml # 应用部署任务
│ └── files/
│ └── wordpress-4.9.4-zh_CN.zip # 应用包
└── security_wordpress/ # 安全加固角色
└── tasks/
└── main.yml # 安全配置任务
四、角色详细设计
1. 基础配置文件
ansible.cfg
[defaults]
remote_user = laoma
inventory = ./inventory
vault_password_file=./secret.txt
roles_path = ./roles # 指定角色路径
[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
inventory
[databases]
blog
[php]
blog
[webservers]
blog
[wordpress]
blog
2. 角色实现
角色:mariadb(数据库部署)
功能:安装 MariaDB、安全初始化。
tasks/main.yml:
- name: 安装MariaDB服务器
yum:
name: mariadb-server,python2-PyMySQL
state: present
- name: 启动MariaDB服务并设置开机自启
service:
name: mariadb
state: started
enabled: yes
- name: 数据库安全初始化 - 设置 root@localhost 密码
shell: mysqladmin password {{ db_root_password }}
ignore_errors: yes
- name: 数据库安全初始化 - 设置其他 root@host 密码
mysql_user:
name: root
password: "{{ db_root_password }}"
host: "{{ item }}"
state: present
login_user: root
login_password: "{{ db_root_password }}"
with_items:
- "{{ ansible_fqdn }}"
- 127.0.0.1
- ::1
- name: 删除匿名用户
mysql_user:
name: ""
host_all: yes
state: absent
login_user: root
login_password: "{{ db_root_password }}"
- name: 删除test数据库
mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ db_root_password }}"
变量配置(group_vars/databases/db.yml):
# 加密前内容
db_root_password: "Root@Db2025!"
wordpress_db_name: "wordpress"
wordpress_user_name: "wordpress"
wordpress_user_password: "Laoma@Db2025!"
加密命令:
ansible-vault encrypt group_vars/databases/db.yml
角色:php(PHP 部署)
功能:安装 PHP-FPM 及 WordPress 所需扩展。
tasks/main.yml:
- name: 安装PHP、PHP-FPM及依赖扩展
yum:
name:
- php
- php-fpm
- php-mysqlnd
- php-gd
- php-xml
- php-mbstring
state: present
- name: 启动PHP-FPM服务
service:
name: php-fpm
state: started
enabled: yes
角色:nginx(Nginx 部署)
功能:安装 Nginx、配置虚拟主机及 PHP 对接。
tasks/main.yml:
- name: 安装EPEL源
yum:
name: epel-release
state: present
- name: 安装Nginx
yum:
name: nginx
state: present
- name: 启动Nginx服务
service:
name: nginx
state: started
enabled: yes
- name: 配置Nginx对接PHP
copy:
src: php.conf
dest: /etc/nginx/default.d/php.conf
notify: 重启Nginx
- name: 部署虚拟主机配置
template:
src: wordpress.conf.j2
dest: /etc/nginx/conf.d/wordpress.conf
notify: 重启Nginx
files/php.conf:
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;
}
templates/wordpress.conf.j2:
server {
listen 80;
server_name {{ blog_virtual_hostname }};
root {{ wordpress_install_dir }};
index index.php index.html;
include /etc/nginx/default.d/*.conf;
access_log /var/log/nginx/access-{{ blog_virtual_hostname }}.log;
error_log /var/log/nginx/error-{{ blog_virtual_hostname }}.log;
}
handlers/main.yml:
- name: 重启Nginx
service:
name: nginx
state: restarted
角色:wordpress(应用部署)
功能:部署 WordPress 代码、配置数据库连接、调整权限。
tasks/main.yml:
- name: 解压WordPress至网站根目录
unarchive:
src: wordpress-{{ wordpress_version }}-zh_CN.zip
dest: /usr/share/nginx/html/
owner: nginx
group: nginx
creates: "{{ wordpress_install_dir }}"
- name: 复制配置样本
command: cp {{ wordpress_install_dir }}/wp-config-sample.php {{ wordpress_install_dir }}/wp-config.php
args:
creates: "{{ wordpress_install_dir }}/wp-config.php"
- name: 配置数据库连接
lineinfile:
path: "{{ wordpress_install_dir }}/wp-config.php"
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: "define\\('DB_NAME', 'database_name_here'\\);", line: "define('DB_NAME', '{{ wordpress_db_name }}');" }
- { regexp: "define\\('DB_USER', 'username_here'\\);", line: "define('DB_USER', '{{ wordpress_user_name }}');" }
- { regexp: "define\\('DB_PASSWORD', 'password_here'\\);", line: "define('DB_PASSWORD', '{{ wordpress_user_password }}');" }
- name: 调整PHP-FPM运行用户为nginx
lineinfile:
path: /etc/php-fpm.d/www.conf
regexp: "{{ item }} = "
line: "{{ item }} = nginx"
loop:
- user
- group
notify: 重启PHP-FPM
handlers/main.yml:
- name: 重启PHP-FPM
service:
name: php-fpm
state: restarted
变量配置(group_vars/all/vars.yml):
wordpress_version: "4.9.4"
wordpress_install_dir: /usr/share/nginx/html/wordpress
变量配置(group_vars/wordpress/vars.yml):
blog_virtual_hostname: blog.laoma.cloud
角色:security_wordpress(安全加固)
功能:配置防火墙、隐藏版本信息、禁用 PHP 危险函数。
tasks/main.yml:
- name: 启动防火墙
service:
name: firewalld
enabled: yes
state: started
- name: 开放80端口
firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
- name: Nginx隐藏版本信息
lineinfile:
path: /etc/nginx/nginx.conf
insertafter: '^http {'
line: ' server_tokens off;'
notify: 重启Nginx
- name: PHP禁用危险函数
lineinfile:
path: /etc/php.ini
regexp: '^disable_functions ='
line: 'disable_functions = exec,passthru,shell_exec,system,proc_open,popen'
notify: 重启PHP-FPM
- name: 输出部署完成信息
debug:
msg: "WordPress部署完成,访问地址: http://{{ ansible_facts['default_ipv4']['address'] }}"
handlers/main.yml:
- name: 重启Nginx
service:
name: nginx
state: restarted
- name: 重启PHP-FPM
service:
name: php-fpm
state: restarted
3. 主 Playbook(deploy_blog.yml)
- name: 部署数据库
hosts: databases
roles:
- mariadb
tasks:
- name: 创建WordPress数据库
mysql_db:
name: "{{ wordpress_db_name }}"
state: present
login_user: root
login_password: "{{ db_root_password }}"
- name: 创建数据库用户并授权
mysql_user:
name: "{{ wordpress_user_name }}"
password: "{{ wordpress_user_password }}"
priv: "{{ wordpress_db_name }}.*:ALL"
host: "localhost"
state: present
login_user: root
login_password: "{{ db_root_password }}"
- name: 部署PHP
hosts: php
roles:
- php
- name: 部署Nginx
hosts: webservers
roles:
- nginx
- name: 部署WordPress
hosts: wordpress
roles:
- wordpress
- name: 安全加固
hosts: php,webservers
roles:
- security_wordpress
五、执行与验证
1. 执行部署
ansible-playbook deploy_blog.yml
2. 服务状态检查
# 检查Nginx状态
systemctl status nginx
# 检查PHP-FPM状态
systemctl status php-fpm
# 检查MariaDB状态
systemctl status mariadb
3. 访问验证
通过浏览器访问服务器 IP 地址,应显示 WordPress 安装页面。
4. 权限检查
ls -ld /usr/share/nginx/html/wordpress
# 预期输出:属主和属组为nginx,权限755
六、维护与扩展
1. 版本升级
- WordPress 升级:
- 替换
roles/wordpress/files/
下的安装包 - 更新
group_vars/all/vars.yml
中的wordpress_version
变量 - 重新执行 Playbook
- 替换
- 组件升级:调整角色中
yum
模块的name
参数指定版本(需测试兼容性)。
2. 配置调整
- 数据库参数:修改
group_vars/databases/db.yml
- 域名 / 目录:修改
group_vars/wordpress/vars.yml
中的相关变量 - 端口配置:修改
nginx/templates/wordpress.conf.j2
中的listen
参数
3. 故障排查
- 日志位置:
- Nginx:
/var/log/nginx/error.log
- PHP-FPM:
/var/log/php-fpm/www-error.log
- MariaDB:
/var/log/mariadb/mariadb.log
- Nginx:
- 检查 Ansible 执行输出,定位失败任务及原因。
七、总结
角色化版本通过将功能模块封装为独立角色,进一步提升了部署方案的模块化程度和可复用性。每个角色可单独维护、测试和升级,适合团队协作场景。
实际生产环境中,建议结合企业安全规范补充以下配置:
- 数据库远程访问限制
- SSL/TLS 证书配置(HTTPS)
- 定期备份策略
- 更严格的文件权限控制