当前位置: 首页 > news >正文

【网络运维】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 应用安装及系统安全加固,确保部署过程标准化、可重复且安全可靠。

http://www.dtcms.com/a/336799.html

相关文章:

  • Java中抽象类与接口的区别
  • 【LeetCode 热题 100】198. 打家劫舍——(解法二)自底向上
  • dc_shell (六)
  • OpenCV---特征检测算法(ORB,Oriented FAST and Rotated BRIEF)
  • AI 对话高效输入指令攻略(五):AI+PicDoc文生图表工具:解锁高效图表创作新范式
  • Tmux Xftp及Xshell的服务器使用方法
  • 深入详解 C++ forward
  • 【数据结构】八大排序之归并排序:分治思想的完美演绎
  • Conda技巧:修改Conda环境目录,节省系统盘空间
  • 深度学习与线性模型在扰动预测上的比较
  • [Linux]学习笔记系列 --[mm][list_lru]
  • Mongodb(文档数据库)的安装与使用(文档的增删改查)
  • vite+react+antd,封装公共组件并发布npm包
  • Zookeeper 在 Kafka 中扮演了什么角色?
  • 密码管理中随机数安全修复方案
  • ELF 动态链接安全:揭秘 RUNPATH 与 RPATH 的库劫持风险
  • AI重塑商业格局:从多模态生成到智能应用的2025行业变革与机遇
  • 【完整源码+数据集+部署教程】无人机目标检测系统源码和数据集:改进yolo11-efficientViT
  • 云原生:重塑软件世界的技术浪潮与编程语言选择
  • redis-集成prometheus监控(k8s)
  • GORM入门:事务管理全解析(二)
  • 机器学习的多种算法
  • 网络间的通用语言TCP/IP-网络中的通用规则2
  • 视觉语言导航(14)——VLN ON ROBOTIC 4.4
  • 力扣32:最长有效括号
  • 飞算JavaAI家庭记账系统:从收支记录到财务分析的全流程管理方案
  • 可编辑150页PPT | 某制造集团产业数字化转型规划方案
  • RH134 管理网络安全知识点
  • 多台服务器批量发布arcgisserver服务并缓存切片
  • JVM 内存管理与垃圾回收机制