【网络运维】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. 准备项目目录

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

相关推荐
TeleostNaCl7 分钟前
OpenWrt 编译 | 一种使用 git submodule 方式实现一键更新多个外部软件包
网络·经验分享·git·智能路由器
倔强的石头_1 小时前
【Linux指南】动静态库与链接机制:从原理到实践
linux
赏点剩饭7781 小时前
linux中的hostpath卷、nfs卷以及静态持久卷的区别
linux·运维·服务器
神鸟云1 小时前
DELL服务器 R系列 IPMI的配置
linux·运维·服务器·网络·边缘计算·pcdn
herderl2 小时前
**僵尸进程(Zombie Process)** 和**孤儿进程(Orphan Process)**
linux·运维·服务器·网络·网络协议
亲爱的非洲野猪2 小时前
令牌桶(Token Bucket)和漏桶(Leaky Bucket)细节对比
网络·算法·限流·服务
tomelrg2 小时前
多台服务器批量发布arcgisserver服务并缓存切片
服务器·python·arcgis
lepton_yang2 小时前
Zephyr下控制ESP32S3的GPIO口
linux·嵌入式硬件·esp32·zephyr
泽02022 小时前
Linux 编译器 gcc 与 g++
linux·运维·服务器