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

【网络运维】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.xdnf.cn/news/18266.html

相关文章:

  • WPF---数据模版
  • 突破成长瓶颈:产品运营能力体系化提升技巧
  • CentOS 7更换国内镜像源
  • Golang context
  • 广州曼顿智能断路器:让用电更聪明,生活更安心!
  • 【案例分享】AI使用分享|如何运用 GPT完成小任务并提升效率 —— Prompt 与案例整理
  • P2404 自然数的拆分问题(典型的dfs)
  • 【运维进阶】实施任务控制
  • 【计算机网络面试】键入网址到网页显示期间,发生了什么?
  • MySQL定时任务详解 - Event Scheduler 事件调度器从基础到实战
  • 第三十九天(WebPack构建打包Mode映射DevTool源码泄漏识别还原)
  • 数据结构:二叉搜索树(Binary Search Tree)
  • Android Studio中创建Git分支
  • 高级堆结构
  • 编排之神-Kubernetes存储专题--ConfigMap演练
  • 网络编程3(网络层,数据链路层)
  • linux下timerfd和posix timer为什么存在较大的抖动?
  • 从零开始:SpringBoot与KingbaseES的完美融合实践
  • JavaScript性能优化实战(三):DOM操作性能优化
  • Ansible 管理变量和事实
  • 【撸靶笔记】第二关:GET -Error based -Intiger based
  • 【LeetCode】单链表经典算法:移除元素,反转链表,约瑟夫环问题,找中间节点,分割链表
  • 计算机网络 TCP三次握手、四次挥手超详细流程【报文交换、状态变化】
  • nn.Module模块介绍
  • USB 2.0声卡
  • 考研复习-操作系统-第一章-计算机系统概述
  • k8s-单主机Master集群部署+单个pod部署lnmp论坛服务(小白的“升级打怪”成长之路)
  • 什么是GD库?PHP中7大类64个GD库函数用法详解
  • 【撸靶笔记】第五关:GET - Double Injection - Single Quotes - String
  • Qt——主窗口 mainWindow