基于 Ansible Playbook 一键部署 LNMP 架构服务器
一、项目概述
本手册旨在详细说明企业内部博客平台 WordPress 的 Ansible 自动化部署方案。该方案基于 LNMP 架构(Linux+Nginx+MariaDB+PHP),通过模块化 Playbook 实现一键部署,同时集成生产环境所需的安全加固措施,确保部署过程标准化、可重复且符合企业安全规范。
本 Playbook 适用于 CentOS 7 操作系统,采用多 Play 结构设计,将部署过程拆分为 5 个独立阶段,便于维护、扩展和团队协作。
二、整体架构与设计思路
1. 技术架构
采用 LNMP 架构组件组合:
- Linux:CentOS 7 操作系统作为基础环境
- Nginx:高性能 Web 服务器,处理 HTTP 请求并解析 PHP
- MariaDB:关系型数据库,存储 WordPress 应用数据
- PHP-FPM:PHP 进程管理器,处理动态脚本执行
2. 模块化设计
将部署流程拆分为 5 个独立 Play,实现职责分离:
- Play 1:数据库部署与安全初始化
- Play 2:PHP 及相关组件部署
- Play 3:Nginx 服务部署
- Play 4:WordPress 应用部署与配置
- Play 5:系统安全加固配置
3. 设计原则
- 幂等性:所有任务均可重复执行,不会产生意外结果
- 安全性:遵循最小权限原则,集成多层安全加固措施
- 可维护性:通过变量集中管理配置项,便于后期调整
- 可扩展性:模块化结构支持单独升级或替换组件
三、详细部署流程
1. 准备项目目录
bash
[furongwang@controller ~]$ mkdir blog && cd blog
[furongwang@controller blog]$ cat > ansible.cfg <<'EOF'
[defaults]
remote_user = furongwang
inventory = ./inventory
vault_password_file=./secret.txt
[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOF
[furongwang@controller blog]$ echo blog ansible_host=10.1.8.12 > inventory
2. Play 1:部署数据库并进行安全初始化
功能说明
负责 MariaDB 数据库的安装、启动、安全配置及 WordPress 所需数据库和用户的创建。
核心任务
- 安装 MariaDB 服务器包
- 启动服务并设置开机自启
- 数据库安全初始化:
- 设置 root 用户密码
- 删除匿名用户
- 删除默认 test 数据库
- 创建 WordPress 专用数据库(webapp_db)
- 创建数据库用户(webapp_user)并授予必要权限
关键变量
ini
webapp_db_name: "webapp_db" # WordPress数据库名
webapp_db_user: "webapp_user" # 数据库访问用户
webapp_db_password: "123456" # 数据库用户密码
db_root_password: "123456" # 数据库root密码
准备变量
bash
[furongwang@controller blog]$ mkdir -p host_vars/blog
[furongwang@controller blog]$ cat > host_vars/blog/db.yaml <<EOF
webapp_db_name: "webapp_db"
webapp_db_user: "webapp_user"
webapp_db_password: "123456"
db_root_password: "123456"
EOF
[furongwang@controller blog]$ echo 123 > secret.txt
[furongwang@controller blog]$ ansible-vault encrypt host_vars/blog/db.yaml
Encryption successful
注意事项
- 生产环境中密码需使用
ansible-vault
加密存储 - 数据库用户仅授予对 webapp_db 的权限,且限制为本地访问
剧本内容
创建play1.yml
yaml
---
- name: Play 1. 部署数据库并进行安全初始化
hosts: blog
gather_facts: yes
become: yes
tasks:
- 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@other 密码
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 }}"
- name: 创建WordPress专用数据库
mysql_db:
name: "{{ webapp_db_name }}"
state: present
login_user: root
login_password: "{{ db_root_password }}"
- name: 创建数据库用户并授权(仅本地访问)
mysql_user:
name: "{{ webapp_db_user }}"
password: "{{ webapp_db_password }}"
priv: "{{ webapp_db_name }}.*:ALL"
host: "localhost"
state: present
login_user: root
login_password: "{{ db_root_password }}"
3. Play 2:部署 PHP 及相关组件
功能说明
安装 PHP 解释器、PHP-FPM 进程管理器及 WordPress 所需的 PHP 扩展模块。
核心任务
- 安装 PHP 核心组件:php、php-fpm
- 安装必要扩展:php-mysqlnd(数据库连接)、php-gd(图片处理)等
- 启动 PHP-FPM 服务并设置开机自启
扩展说明
- php-mysqlnd 替代传统 php-mysql,提供更好的性能和兼容性
- 所有扩展均为 WordPress 运行必需组件,确保功能完整性
剧本内容
创建play2.yml
yaml
---
- name: Play 2. 部署PHP及相关组件
hosts: blog
become: yes
tasks:
- name: 安装PHP、PHP-FPM及依赖扩展
yum:
name:
- php
- php-fpm
- php-mysqlnd # 替代php-mysql,适配新版PHP
- php-gd # 处理图片上传
- php-xml # XML解析支持
- php-mbstring # 多字节字符串支持
state: present
- name: 启动PHP-FPM服务并设置开机自启
service:
name: php-fpm
state: started
enabled: yes
4. Play 3:部署 Nginx 服务
功能说明
安装并启动 Nginx 服务,作为 Web 服务器处理 HTTP 请求。
核心任务
- 安装 EPEL 源(Nginx 依赖)
- 安装 Nginx 服务
- 启动服务并设置开机自启
前置条件
需先安装 EPEL 源,因为 Nginx 不在 CentOS 默认 yum 源中
剧本内容
创建play3.yml
yaml
---
- name: Play 3. 部署Nginx服务
hosts: blog
become: yes
tasks:
- name: 安装EPEL源(Nginx依赖)
yum:
name: epel-release
state: present
- name: 安装 Nginx
yum:
name: nginx
state: present
- name: 启动Nginx服务并设置开机自启
service:
name: nginx
state: started
enabled: yes
5. Play 4:部署博客应用(WordPress)
功能说明
下载并部署 WordPress 应用程序,配置数据库连接,设置 Web 服务器和 PHP 运行环境。
核心任务
- 提前下载好网站文件
- 解压并部署到网站根目录
- 配置数据库连接信息到 wp-config.php
- 调整 PHP-FPM 运行用户为 nginx
- 创建 Nginx 虚拟主机配置
- 设置网站目录权限
关键配置
- 网站根目录:
/usr/share/nginx/html
- Nginx 虚拟主机配置:
/etc/nginx/conf.d/wordpress.conf
- PHP-FPM 配置文件:
/etc/php-fpm.d/www.conf
注意事项
- 采用文件校验确保 WordPress 源码完整性
- 统一 PHP-FPM 和 Nginx 运行用户为 nginx,避免权限冲突
剧本内容
创建play4.yml
yaml
---
- name: Play 4. 部署博客应用(WordPress)
hosts: blog
become: yes
vars:
blog_vhost: blog.furongwang.cloud
wp_version: "4.9.4"
wp_install_dir: "/usr/share/nginx/html/{{ blog_vhost }}/wordpress"
tasks:
- name: 创建虚拟主机站点目录
file:
path: /usr/share/nginx/html/{{ blog_vhost }}
state: directory
- name: 解压WordPress至网站根目录
unarchive:
src: "wordpress-{{ wp_version }}-zh_CN.zip"
dest: /usr/share/nginx/html/{{ blog_vhost }}
owner: nginx
group: nginx
creates: "{{ wp_install_dir }}"
- name: 复制WordPress配置样本
command: cp {{ wp_install_dir }}/wp-config-sample.php {{ wp_install_dir }}/wp-config.php
args:
creates: "{{ wp_install_dir }}/wp-config.php"
- name: 配置数据库连接信息
lineinfile:
path: "{{ wp_install_dir }}/wp-config.php"
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: "define\\('DB_NAME', 'database_name_here'\\);", line: "define('DB_NAME', '{{ webapp_db_name }}');" }
- { regexp: "define\\('DB_USER', 'username_here'\\);", line: "define('DB_USER', '{{ webapp_db_user }}');" }
- { regexp: "define\\('DB_PASSWORD', 'password_here'\\);", line: "define('DB_PASSWORD', '{{ webapp_db_password }}');" }
- name: 配置PHP-FPM运行用户和组为nginx
lineinfile:
path: /etc/php-fpm.d/www.conf
regexp: "{{ item}} = "
line: "{{ item }} = nginx"
loop:
- user
- group
notify: 重启PHP-FPM服务 # 配置变更后触发重启
- name: 配置 nginx 对接 php
copy:
src: php.conf
dest: /etc/nginx/default.d/php.conf
- name: 创建Nginx虚拟主机配置
template:
src: vhost-wordpress.conf.j2
dest: /etc/nginx/conf.d/vhost-wordpress.conf
notify: 重启Nginx服务
handlers:
- name: 重启Nginx服务
service:
name: nginx
state: restarted
- name: 重启PHP-FPM服务
service:
name: php-fpm
state: restarted
配置nginx对接php
bash
[furongwang@controller blog]$ 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
准备虚拟站点模版
bash
[furongwang@controller blog]$ 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
6. Play 5:安全加固配置
功能说明
对整个系统和应用环境进行安全加固,符合生产环境安全要求。
核心任务
- 防火墙配置:开放 80 端口
- Nginx 安全加固:隐藏版本信息
- PHP 安全加固:禁用危险函数
- 输出部署完成信息
安全措施说明
- 防火墙仅开放必要端口,限制网络访问
- SELinux 保持开启状态,通过上下文配置实现安全访问控制
- 禁用 PHP 危险函数(如 exec、system 等)防止命令注入攻击
- 隐藏 Nginx 版本信息,减少信息泄露
剧本内容
创建play5.yml
yaml
---
- name: Play 5. 安全加固配置
hosts: blog
become: yes
vars:
wp_install_dir: "/usr/share/nginx/html"
tasks:
- name: 启动防火墙
service:
name: firewalld
enabled: yes
state: started
- name: 防火墙开放80端口(HTTP)
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:
- name: 重启Nginx服务
service:
name: nginx
state: restarted
- name: 重启PHP-FPM服务
service:
name: php-fpm
state: restarted
四、执行与验证
1. 执行方法
- 将上文准备完成的play1.yml、play2.yml、play3.yml、play4.yml、play5.yml 合并为一个文件:deploy_wordpress_multi_play.yml
- 检查语法,删除多余的 "---"三短横杠开头行
- 执行文件
bash
[furongwang@controller blog]$ ansible-playbook -i inventory deploy_wordpress_multi_play.yml
运行结果例:
2. 验证步骤
-
检查服务状态:
bash# 登录lnmp客户端 # 检查Nginx状态 [furongwang@node2 ~]$ systemctl status nginx # 检查PHP-FPM状态 [furongwang@node2 ~]$ systemctl status php-fpm # 检查MariaDB状态 [furongwang@node2 ~]$ systemctl status mariadb
-
验证网站访问:
通过浏览器访问输出的 IP 地址,应能看到 WordPress 安装页面
-
检查文件权限:
bash[furongwang@node2 ~]$ ls -ld /usr/share/nginx/html # 应显示权限为755,属主和属组为nginx

- 权限错误时,使用chmod命令和chown命令进行调整
五、维护与扩展
1. 版本升级
- WordPress 升级:修改
wp_version
变量为目标版本 - 组件升级:调整对应 yum 包的状态为 latest(需谨慎测试)
2. 配置调整
- 数据库参数:修改 Play 2 中的相关变量
- 网站目录:修改
wp_install_dir
变量并同步调整相关路径配置 - 端口配置:修改 Nginx 虚拟主机配置中的 listen 参数
3. 故障排查
-
查看服务日志:
bash# Nginx日志 tail -f /var/log/nginx/error.log # PHP-FPM日志 tail -f /var/log/php-fpm/www-error.log # MariaDB日志 tail -f /var/log/mariadb/mariadb.log
-
检查 Playbook 执行输出,定位失败任务
-
验证 SELinux 上下文:
ls -Z /usr/share/nginx/html
六、总结
本文详细介绍了基于 Ansible Playbook 自动化部署 LNMP(Linux+Nginx+MariaDB+PHP)架构的 WordPress 博客平台的完整方案。通过模块化设计,将部署流程拆分为五个独立的 Play,分别负责数据库初始化、PHP 环境配置、Nginx 服务部署、WordPress 应用安装及系统安全加固,确保部署过程标准化、可重复且安全可靠。