【网络运维】Playbook项目实战:基于 Ansible Playbook 一键部署 LNMP 架构服务器
基于 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. 准备项目目录
[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)并授予必要权限
关键变量
webapp_db_name: "webapp_db" # WordPress数据库名
webapp_db_user: "webapp_user" # 数据库访问用户
webapp_db_password: "123456" # 数据库用户密码
db_root_password: "123456" # 数据库root密码
准备变量
[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
---
- name: Play 1. 部署数据库并进行安全初始化hosts: bloggather_facts: yesbecome: yestasks:- name: 安装MariaDB服务器yum:name: mariadb-server,python2-PyMySQLstate: present- name: 启动MariaDB服务并设置开机自启service:name: mariadbstate: startedenabled: yes- name: 数据库安全初始化 - 设置 root@localhost 密码shell: mysqladmin password {{ db_root_password }}ignore_errors: yes- name: 数据库安全初始化 - 设置其他 root@other 密码mysql_user:name: rootpassword: "{{ db_root_password }}"host: "{{ item }}"state: presentlogin_user: rootlogin_password: "{{ db_root_password }}"with_items:- "{{ ansible_fqdn }}"- 127.0.0.1- ::1- name: 数据库安全初始化 - 删除匿名用户mysql_user:name: ""host_all: yesstate: absentlogin_user: rootlogin_password: "{{ db_root_password }}"- name: 数据库安全初始化 - 删除test数据库mysql_db:name: teststate: absentlogin_user: rootlogin_password: "{{ db_root_password }}"- name: 创建WordPress专用数据库mysql_db:name: "{{ webapp_db_name }}"state: presentlogin_user: rootlogin_password: "{{ db_root_password }}"- name: 创建数据库用户并授权(仅本地访问)mysql_user:name: "{{ webapp_db_user }}"password: "{{ webapp_db_password }}"priv: "{{ webapp_db_name }}.*:ALL"host: "localhost"state: presentlogin_user: rootlogin_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
---
- name: Play 2. 部署PHP及相关组件hosts: blogbecome: yestasks:- 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-fpmstate: startedenabled: yes
4. Play 3:部署 Nginx 服务
功能说明
安装并启动 Nginx 服务,作为 Web 服务器处理 HTTP 请求。
核心任务
- 安装 EPEL 源(Nginx 依赖)
- 安装 Nginx 服务
- 启动服务并设置开机自启
前置条件
需先安装 EPEL 源,因为 Nginx 不在 CentOS 默认 yum 源中
剧本内容
创建play3.yml
---
- name: Play 3. 部署Nginx服务hosts: blogbecome: yestasks:- name: 安装EPEL源(Nginx依赖)yum:name: epel-releasestate: present- name: 安装 Nginxyum:name: nginxstate: present- name: 启动Nginx服务并设置开机自启service:name: nginxstate: startedenabled: 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
---
- name: Play 4. 部署博客应用(WordPress)hosts: blogbecome: yesvars:blog_vhost: blog.furongwang.cloudwp_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: nginxgroup: nginxcreates: "{{ wp_install_dir }}"- name: 复制WordPress配置样本command: cp {{ wp_install_dir }}/wp-config-sample.php {{ wp_install_dir }}/wp-config.phpargs: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运行用户和组为nginxlineinfile:path: /etc/php-fpm.d/www.confregexp: "{{ item}} = "line: "{{ item }} = nginx"loop:- user- groupnotify: 重启PHP-FPM服务 # 配置变更后触发重启- name: 配置 nginx 对接 phpcopy:src: php.confdest: /etc/nginx/default.d/php.conf- name: 创建Nginx虚拟主机配置template:src: vhost-wordpress.conf.j2dest: /etc/nginx/conf.d/vhost-wordpress.confnotify: 重启Nginx服务handlers:- name: 重启Nginx服务service:name: nginxstate: restarted- name: 重启PHP-FPM服务service:name: php-fpmstate: restarted
配置nginx对接php
[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
准备虚拟站点模版
[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 fileaccess_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
---
- name: Play 5. 安全加固配置hosts: blogbecome: yesvars:wp_install_dir: "/usr/share/nginx/html"tasks:- name: 启动防火墙service:name: firewalldenabled: yesstate: started- name: 防火墙开放80端口(HTTP)firewalld:service: httppermanent: yesimmediate: yesstate: enabled- name: Nginx安全加固 - 隐藏版本信息lineinfile:path: /etc/nginx/nginx.confinsertafter: '^http {'line: ' server_tokens off;'notify: 重启Nginx服务- name: PHP安全加固 - 禁用危险函数lineinfile:path: /etc/php.iniregexp: '^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: nginxstate: restarted- name: 重启PHP-FPM服务service:name: php-fpmstate: restarted
四、执行与验证
1. 执行方法
- 将上文准备完成的play1.yml、play2.yml、play3.yml、play4.yml、play5.yml 合并为一个文件:deploy_wordpress_multi_play.yml
- 检查语法,删除多余的 “—”三短横杠开头行
- 执行文件
[furongwang@controller blog]$ ansible-playbook -i inventory deploy_wordpress_multi_play.yml
运行结果例:
2. 验证步骤
-
检查服务状态:
# 登录lnmp客户端 # 检查Nginx状态 [furongwang@node2 ~]$ systemctl status nginx# 检查PHP-FPM状态 [furongwang@node2 ~]$ systemctl status php-fpm# 检查MariaDB状态 [furongwang@node2 ~]$ systemctl status mariadb
-
验证网站访问:
通过浏览器访问输出的 IP 地址,应能看到 WordPress 安装页面 -
检查文件权限:
[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. 故障排查
-
查看服务日志:
# 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 应用安装及系统安全加固,确保部署过程标准化、可重复且安全可靠。