【运维进阶】LNMP + WordPress 自动化部署实验

LNMP + WordPress 自动化部署实验

一、实验目标

通过 Ansible 自动化工具,在目标服务器(lnmp 主机组)上搭建 LNMP 架构(Linux 系统 + Nginx 网页服务器 + MariaDB 数据库 + PHP 脚本语言),并部署 WordPress 博客系统,最终实现通过浏览器访问博客。

二、前置知识说明

术语 / 工具作用说明
Ansible自动化运维 “管家”,靠 YAML 剧本批量干活,目标机无需装客户端,轻量又方便。
LNMPWeb 架构 “铁三角”:Nginx 接请求、PHP 算动态、MariaDB 存数据,撑起网站运行。
MariaDB开源数据库 “备胎转正”(MySQL 分支),专门存 WordPress 的文章、用户等数据。
Nginx轻量网页 “门卫”,负责接请求、秀静态页面,还能把动态活儿转给 PHP 处理。
PHP-FPMPHP 的 “包工头”,管理进程处理 Nginx 转来的动态请求,让代码跑起来。
WordPress博客建站 “神器”,搭好 LNMP 就能用,小白也能轻松发文章、做网站。
Ansible VaultAnsible 的 “密码保险箱”,给数据库密码等敏感信息加密,防止泄露。

三、实验环境准备

角色主机名系统核心软件IP 地址(示例)
控制节点(执行命令)controllerCentOS 7Ansible、LNMP 配置文件10.1.8.10
目标节点(部署服务)node1(属于 lnmp 组)CentOS 7无(Ansible 自动安装软件)10.1.8.11
客户端(访问博客)个人电脑Windows 10/11浏览器-

四、详细部署流程

1. 初始化控制节点工作目录(存放配置文件)
# 把原有 web 目录复制一份,命名为 lnmp,作为本次实验的 “工作目录”(所有配置文件都放在这里,不影响其他文件)。
[lth@controller ~ 22:00:38]$  cp -r web lnmp# 进入 lnmp 工作目录,后续所有命令都在这个目录下执行。
[lth@controller ~ 22:00:45]$ cd lnmp/# 删除 lnmp 目录里所有原文件,避免旧文件干扰本次实验,保证环境 “干净”。
[lth@controller lnmp 22:01:02]$ rm -rf *# 从上级目录web拷贝两个关键文件到当前lnmp目录
[lth@controller lnmp 22:01:21]$ cp ../web/ansible.cfg .
[lth@controller lnmp 22:01:26]$ cp ../web/inventory .
2. 准备变量文件
# 创建变量目录
[lth@controller lnmp 22:01:34]$ mkdir host_vars
[lth@controller lnmp 22:01:36]$ mkdir host_vars/lnmp# 编写敏感变量文件
[lth@controller lnmp 22:01:52]$ vim host_vars/lnmp/vaults.yml
[lth@controller lnmp 22:02:16]$ cat host_vars/lnmp/vaults.ymlmysql_root_password: 123app_user: wordpressapp_password: 123app_host: '%'app_priv: '*.*:ALL'

每个配置项是什么意思?

配置项含义作用
mysql_root_password: 123MariaDB 数据库的 root 密码(最高权限密码)用于初始化数据库、创建用户和库
app_user: wordpress给 WordPress 用的数据库用户名WordPress 只能用这个用户操作数据库,避免用 root 提权风险
app_password: 123WordPress 数据库用户的密码验证 WordPress 对数据库的访问权限
app_host: ‘%’允许该用户从 “任意主机” 连接数据库这里是本地部署,% 表示目标机自身可以访问
app_priv: ‘.:ALL’该用户拥有 “所有数据库、所有权限”让 WordPress 能创建表、插入数据(实际生产可缩小权限,实验简化用 ALL)

这些是敏感信息(密码),后续要加密保护,不能明文暴露。

# 编写普通变量文件
[lth@controller lnmp 22:02:29]$ vim host_vars/lnmp/vars.yml
[lth@controller lnmp 22:02:31]$ cat host_vars/lnmp/vars.yml
db_name: webapp
# db_name: webapp 表示给 WordPress 专门创建的数据库名是 webapp。# 加密敏感变量文件
[lth@controller lnmp 22:02:46]$ ansible-vault encrypt host_vars/lnmp/vaults.ymlNew Vault password: '123'Confirm New Vault password: '123'Encryption successful# 创建解密密码文件
[lth@controller lnmp 22:14:21]$ echo 123 > secret.txt# 验证加密文件能否正常解密
[lth@controller lnmp 22:14:26]$ ansible-vault view host_vars/lnmp/vaults.yml
3. 准备核心配置文件(Ansible 剧本、Nginx/PHP 配置)
# 编写 Ansible 主配置文件
[lth@controller lnmp 22:16:12]$ vim ansible.cfg
[lth@controller lnmp 22:16:14]$ cat ansible.cfg
[defaults]
remote_user = lth                                                  
inventory = ./inventory
#gathering = explicit
vault_password_file=./secret.txt
#roles_path  = ./roles
#collections_paths = ./collections[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
# 关键注意点:目标节点必须配置 lth 用户的 sudo 免密(否则 Ansible 执行安装命 令会失败),配置方法:在目标机 node1 上执行 visudo,添加 lth ALL=(ALL) NOPASSWD: ALL。# 编写 PHP 配置文件(让 Nginx 能处理 PHP 请求)
[lth@controller lnmp 22:16:25]$ vim php.conf
[lth@controller lnmp 22:16:27]$ cat php.conf
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;             
}# 编写 WordPress 虚拟主机模板(让 Nginx 识别博客域名)
[lth@controller lnmp 22:21:55]$ vim vhost-wordpress.conf.j2
[lth@controller lnmp 22:21:59]$ cat vhost-wordpress.conf.j2
server {listen       80;server_name  {{ blog_vhost }};root         /usr/share/nginx/html/{{ blog_vhost }}/wordpress;index index.php;# 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;
}# 本地安装 Nginx
[lth@controller lnmp 22:22:51]$ sudo yum install -y nginx
4. 编写 Ansible 核心剧本
# 创建并编辑部署剧本
[lth@controller lnmp 22:25:44]$ vim deploy_lnmp.yml

内容如下:

--
- name: deploy mariadbhosts: lnmptasks:# 安装数据库- name: install mariadb-serveryum:name: - mariadb-server- python2-PyMySQLstate: present# 启动服务- name: enable and start mariadbservice:name: mariadbenabled: yesstate: started# 设置 root 密码- name: set root@localhost passwordshell: mysqladmin password {{ mysql_root_password }}ignore_errors: yes- name: set root passwordmysql_user:name: rootpassword: "{{ mysql_root_password }}"host: "{{ item }}"state: presentlogin_user: rootlogin_password: "{{ mysql_root_password }}"with_items:- "{{ ansible_fqdn }}"- 127.0.0.1- ::1# 删除匿名用户- name: delete user anonymousmysql_user:name: ""host_all: yesstate: absentlogin_user: rootlogin_password: "{{ mysql_root_password }}"#login_unix_socket: /var/lib/mysql/mysql.sock# 删除测试数据库- name: delete database testmysql_db:name: teststate: absentlogin_user: rootlogin_password: "{{ mysql_root_password }}"- name: prepare db for webapphosts: lnmptasks:# 创建新用户- name: create user {{ user }}mysql_user:name: "{{ app_user }}"password: "{{ app_password }}"host: "{{ app_host }}"priv: "{{ app_priv }}"state: presentlogin_user: rootlogin_password: "{{ mysql_root_password }}"# 创建新库- name: create database db_namemysql_db:name: "{{ db_name }}"state: presentlogin_user: rootlogin_password: "{{ mysql_root_password }}"- name: deploy web serverhosts: lnmptasks:- name: install nginxyum:name: nginxstate: present# 启动服务- name: enable and start nginxservice:name: nginxenabled: yesstate: started- name: prepare test file for web servercopy:content: hello world from nginxdest: /usr/share/nginx/html/index.html- name: phphosts: lnmptasks:- name: install phpyum:name: php,php-fpm,php-mysqlndstate: present- name: modify running user for phplineinfile:path: /etc/php-fpm.d/www.confregexp: "{{ item}} = "line: "{{ item }} = nginx"loop:- user- group# 启动服务- name: enable and start php-fpm.serviceservice:name: php-fpmenabled: yesstate: restarted- name: config php for nginxcopy:src: php.confdest: /etc/nginx/default.d/php.conf- name: restart nginxservice:name: nginxstate: restarted- name: deploy web apphosts: lnmpvars:blog_vhost: blog.xiexin.cloudtasks:- name: prepare vhost for wordpresstemplate:src: vhost-wordpress.conf.j2dest: /etc/nginx/conf.d/vhost-wordpress.conf- name: create /usr/share/nginx/html/{{ blog_vhost }}file:path: /usr/share/nginx/html/{{ blog_vhost }}state: directory- name: Unarchive a wordpress file unarchive:src: wordpress-4.9.4-zh_CN.zipdest: /usr/share/nginx/html/{{ blog_vhost }}/owner: nginxgroup: nginx- name: restart nginxservice:name: nginxstate: restarted

剧本关键注意点:

  • 必须提前下载 wordpress-4.9.4-zh_CN.zip 到控制节点的 lnmp 目录(下载地址:https://wordpress.org/wordpress-4.9.4-zh_CN.zip);

  • 剧本按 “数据库→Web 服务器→PHP→博客” 顺序执行,不能乱序(比如先装 PHP 再装数据库,PHP 连接数据库会失败)。

5. 执行自动化部署
# 执行剧本
[lth@controller lnmp 22:30:15]$ ansible-playbook deploy_lnmp.yml
PLAY [deploy mariadb] ***************************************************************************TASK [Gathering Facts] **************************************************************************
ok: [lnmp]TASK [install mariadb-server] *******************************************************************
ok: [lnmp]TASK [enable and start mariadb] *****************************************************************
ok: [lnmp]
........# 关闭目标机冲突服务(避免端口被占)
[root@node1 ~ 22:30:24]# systemctl disable httpd --now
6. 验证部署结果(确保每个组件都正常)
# 在node1上执行,查看WordPress文件是否存在
[root@node1 ~ 22:30:29]$ ls /usr/share/nginx/html/blog.xiexin.cloud/wordpress/index.php        wp-admin              wp-content         wp-load.php      wp-signup.phplicense.txt      wp-blog-header.php    wp-cron.php        wp-login.php     wp-trackback.phpreadme.html      wp-comments-post.php  wp-includes        wp-mail.php      xmlrpc.phpwp-activate.php  wp-config-sample.php  wp-links-opml.php  wp-settings.php# 如果失败:检查 Ansible 剧本中 “解压 WordPress” 的任务是否成功,或压缩包是否在控制节点的 `lnmp` 目录。# 继续在node1上执行,查看文件权限(确保所有者是nginx)[root@node1 ~ 22:30:38]$ ll /usr/share/nginx/html/blog.xiexin.cloud/wordpress/
# 验证 MariaDB 数据库是否正常(目标节点 node1)
# 在node1上执行,用WordPress专用用户登录数据库
[root@node1 ~ 22:36:50]# mysql -uwordpress -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.68-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> # 登录后执行,查看数据库列表
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| webapp             |
+--------------------+
4 rows in set (0.01 sec)
# 如果没有 webapp 库:检查 Ansible 剧本中 “创建数据库” 的任务是否成功。# 退出数据库
MariaDB [(none)]> exit
Bye
7. 浏览器访问博客(完成 WordPress 安装)
1. 配置 Windows 客户端 Hosts(让浏览器识别博客域名)
  1. 打开 Windows 文件管理器,进入路径:C:\Windows\System32\drivers\etc;

  2. 找到 hosts 文件,右键用 “记事本” 打开(需管理员权限,否则无法保存);

  3. 在文件末尾添加一行:10.1.8.11 blog.xiexin.cloud;

  4. 保存并关闭文件。

2. 访问 WordPress 并完成安装
  1. 打开浏览器(Chrome、Edge 等),在地址栏输入 blog.xiexin.cloud,按回车;

  2. 进入 WordPress 安装向导,选择 “中文”,点击 “继续”;

  3. 点击 “现在就开始!”,填写数据库信息(和vaults.yml、vars.yml一致):

  4. 数据库名:webapp

  5. 用户名:wordpress

  6. 密码:123

  7. 数据库主机:localhost(本地数据库,不用改)

  8. 表前缀:默认 wp_(不用改)

  9. 点击 “提交”,再点击 “运行安装程序”;

  10. 填写博客信息(自定义):

  11. 站点标题:blog

  12. 用户名:xiexin

  13. 密码:123

  14. 电子邮件:xiexin@123.com

  15. 点击 “安装 WordPress”,安装完成后用刚才的用户名密码登录;

  16. 登录后进入博客后台,或点击 “访问站点” 查看博客首页,至此实验完成!

结果截图:

在这里插入图片描述

五、常见问题排查

问题现象可能原因解决方法
执行剧本时 “yum 安装软件失败”目标节点网络不通,或 yum 源有问题1. 在 node1 上 ping 百度(ping baidu.com)确认网络; 2. 更换 yum 源为阿里云(yum install -y wget && wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo)
浏览器访问 blog.xiexin.cloud 显示 “无法访问”1. 目标节点 Nginx 没启动; 2. 客户端 Hosts 配置错误; 3. 防火墙拦截 80 端口1. 在 node1 上执行 systemctl status nginx 确认 Nginx 已启动; 2. 检查 Windows Hosts 配置的 IP 和域名是否正确; 3. 在 node1 上关闭防火墙(systemctl stop firewalld && systemctl disable firewalld)
WordPress 安装时 “无法连接数据库”1. 数据库密码输错; 2. MariaDB 没启动; 3. 数据库用户权限不够1. 确认密码和 vaults.yml 一致; 2. 在 node1 上执行 systemctl status mariadb 确认数据库已启动; 3. 检查剧本中 app_priv 是否为 .:ALL
访问 PHP 文件显示 “下载文件” 而非执行Nginx 的 PHP 配置没生效,或 PHP-FPM 没启动1. 在 node1 上执行 systemctl status php-fpm 确认 PHP-FPM 已启动; 2. 检查 /etc/nginx/default.d/php.conf 文件是否存在且内容正确

六、总结

这个实验就像请了个叫 Ansible 的 “全能管家”,把搭建博客的活儿全承包了!先给它搭好 “工作台”(控制节点和目标节点),藏好数据库密码这些 “私房钱”(敏感信息加密),再写好 “工作指南”(配置文件和剧本)。

接着管家就按流程开工:先装数据库 MariaDB 当 “储物间”,再摆上 Nginx 这扇 “大门”,请来 PHP-FPM 当 “计算器” 处理动态请求,最后把 WordPress 这 “博客家具” 搬进去摆好。

完事还得检查检查:门有没有锁好(服务状态)、地址标没标对(客户端 Hosts),确认无误后,就能舒舒服服在浏览器里给新博客 “剪彩” 啦 —— 全程不用自己动手拧一颗螺丝,这自动化部署可太省心了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

豆包 Java的23种设计模式

Java的23种设计模式是软件开发中常用的设计思想总结,根据用途可分为三大类:创建型、结构型和行为型。 一、创建型模式(5种) 用于处理对象创建机制,隐藏创建逻辑,使程序更灵活。 单例模式:保证一…

RISC-V汇编新手入门

有空就更。一、基础核心概念:什么是汇编语言?汇编语言是直接对应 CPU 指令的低级编程语言,每一行汇编代码基本对应一条 CPU 能直接执行的指令。相比 C 语言等高级语言,汇编更贴近硬件,能直接操作 CPU 的寄存器、内存和…

[每周一更]-(第155期):Go 1.25 发布:新特性、技术思考与 Go vs Rust 竞争格局分析

作为一名 Go 研发工程师,我一直关注 Go 语言的演进。2025 年 8 月 12 日,Go 团队发布了 Go 1.25 版本,这是继 Go 1.24 之后的又一重要更新。 这个版本聚焦于工具链优化、运行时改进和实验性功能引入,没有引入破坏性语言变化&#…

【网络安全】Webshell的绕过——绕过动态检测引擎WAF-缓存绕过(Hash碰撞)

目录 一、前言 二、环境 三、了解动态检测引擎 3.1 shuffle — 打乱数组 3.2 mt_srand — 播下一个更好的随机数发生器种子 四、缓存导致的绕过【hash碰撞】 五、总结 一、前言 在渗透测试过程中,成功获取 WebShell 时难免遇到 Web 应用防火墙(WA…

【Linux | 网络】高级IO

一、IO是什么二、五种IO模型2.1 理解五种IO模型2.2 五种IO模型的定义三、 非阻塞IO3.1 fcntl函数3.2 实现函数SetNoBlock(将文件描述符设置为非阻塞)四、多路转接IO4.1 多路转接IO之select4.1.1 select函数4.1.2 select的优缺点4.2 多路转接IO之poll4.2.…

图解简单选择排序C语言实现

1 简单选择排序 简单选择排序(Simple Selection Sort)是一种基础且直观的排序算法,其核心思想是通过重复选择未排序部分中的最小(或最大)元素,并将其放到已排序部分的末尾,逐步完成整个序列的排…

[go] 桥接模式

桥接模式 是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。 模型说明抽象部分(Abstraction)提供高层控制逻辑,依赖于完成底层实际工作的实现对象…

【自用】JavaSE--特殊文件Properties与XML、日志技术

特殊文件概述使用特殊文件可以存储多个有关系的数据,作为系统的配置信息属性文件类似于键值对,一一对应存储数据(比如用户名与密码)XML文件存储多个用户的多个属性更适合,适合存储更复杂的数据Properties注:这个属性文件的后缀即使…

【轨物方案】预防性运维:轨物科技用AI+机器人重塑光伏电站价值链

传统光伏电站的运维模式,常常被视为一个“成本中心”,其“故障-抢修”的逻辑模式,不仅响应滞后、效率低下,更难以从根本上提升资产的长期价值。然而,随着新能源行业的深刻发展,运维的价值被重新定义&#x…

【自动化运维神器Ansible】Ansible比较操作符详解:从基础到实战应用

目录 引言 1 Ansible比较操作符概述 1.1 什么是比较操作符&#xff1f; 1.2 比较操作符的分类与核心符号 2 核心比较操作符详解 2.1 相等与不等&#xff1a;与! 语法与基础用法 示例&#xff1a;字符串与数值比较 注意事项 2.2 大小比较&#xff1a;>、>、<…

配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题

一、概述 记录时间 [2025-08-16] 在 Docker 学习中&#xff0c;可能会遇到诸如 docker 远程仓库无法访问、docker pull 拉取镜像失败、docker search 查询镜像失败等问题。 这是由于国内网络对 docker 远程仓库的访问受到限制。 那么在国内如何获取 docker 镜像呢&#xff1f…

智能工厂生产监控大屏-vue纯前端静态页面练习

学习前端还是非常有意思的&#xff0c;因为前端真的是可见即所得&#xff0c;可以做出来非常好看漂亮的页面&#xff0c;最近我就在使用前端技术 做一些大屏报表&#xff0c;在制作这些大屏报表过程中&#xff0c;又熟练的练习了自己的学到的相关的前端技术&#xff0c;接下来把…