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

WordPress (LNMP 架构) 一键部署 Playbook

WordPress (LNMP 架构) 一键部署 Playbook

采用 LNMP 架构组件组合:

  • Linux:CentOS 7 操作系统作为基础环境
  • Nginx:高性能 Web 服务器,处理 HTTP 请求并解析 PHP
  • MariaDB:关系型数据库,存储 WordPress 应用数据
  • PHP-FPM:PHP 进程管理器,处理动态脚本执行

第一部分:deploy lnmp(部署 LNMP 基础环境)

- name: deploy lnmp  # Play 名称:部署 LNMP 环境hosts: lnmp  # 目标主机组:lnmp(在 inventory 中定义的主机)vars:  # 变量定义区,后续任务可引用这些变量mysql_root_password: '123'  # MariaDB root 用户密码app_host: "localhost"  # 数据库应用用户允许访问的主机(本地)app_user: 'yy'  # 应用使用的数据库用户名app_password: '123'  # 应用数据库用户的密码app_priv: "{{ db_name }}.*:ALL"  # 应用用户的数据库权限(对 db_name 数据库的所有表有全部权限)db_name: webapp  # 应用使用的数据库名称tasks:  # 任务列表:具体部署步骤
任务 1:安装 MariaDB 及相关依赖
    - name: install mariadb  # 任务名称:安装 MariaDB 相关包yum:  # 使用 yum 模块(适用于 RHEL/CentOS 系统)name:  # 要安装的包列表- mariadb-server  # MariaDB 服务端- python2-PyMySQL  # Python 连接 MySQL 的库(供 Ansible 模块使用)state: present  # 确保包已安装(若未安装则安装)
任务 2:启动并启用 MariaDB 服务
    - name: start mariadb  # 任务名称:启动 MariaDB 服务service:  # 使用 service 模块管理系统服务name: mariadb  # 服务名称:mariadbstate: started  # 状态:启动(若未运行则启动)enabled: yes  # 开机自启:启用
任务 3:设置 MariaDB root@localhost 密码(初始设置)
    - name: set root@localhost password  # 任务名称:设置 root@localhost 密码shell: mysqladmin password '{{ mysql_root_password }}'  # 执行 shell 命令:用 mysqladmin 设置 root 密码ignore_errors: yes  # 忽略错误(若密码已设置,再次执行会报错,此处忽略以继续后续任务)
任务 4:为不同主机设置 root 密码(完善密码配置)
    - name: set root password  # 任务名称:为不同主机设置 root 密码mysql_user:  # 使用 mysql_user 模块管理数据库用户name: root  # 用户名:rootpassword: "{{ mysql_root_password }}"  # 密码:引用变量中的 root 密码host: "{{ item }}"  # 允许登录的主机:循环中的每个值(见下方 with_items)state: present  # 确保用户存在login_user: root  # 执行操作时的登录用户:rootlogin_password: "{{ mysql_root_password }}"  # 登录密码:引用 root 密码with_items:  # 循环:对以下主机分别设置- "{{ ansible_fqdn }}"  # 主机的完全限定域名(如 node1.example.com)- 127.0.0.1  # IPv4 本地回环地址- ::1  # IPv6 本地回环地址

作用:确保 root 用户可以从本地、FQDN 等地址登录,统一密码

任务 5:创建应用数据库用户
    - name: create user{{ user }}  # 任务名称:创建应用数据库用户(注:变量名应为 app_user,可能笔误)mysql_user:  # 使用 mysql_user 模块name: '{{ app_user }}'  # 用户名:引用 app_user 变量(yy)password: '{{ app_password }}'  # 密码:引用 app_password 变量(123)priv: "{{ app_priv }}"  # 权限:引用 app_priv 变量(webapp.*:ALL)host: '{{ app_host }}'  # 允许登录的主机:引用 app_host 变量(localhost)state: present  # 确保用户存在login_user: root  # 登录用户:rootlogin_password: "{{ mysql_root_password }}"  # 登录密码:root 密码
任务 6:创建应用数据库
    - name: create database db_name  # 任务名称:创建应用数据库mysql_db:  # 使用 mysql_db 模块管理数据库name: "{{ db_name }}"  # 数据库名:引用 db_name 变量(webapp)state: present  # 确保数据库存在login_user: root  # 登录用户:rootlogin_password: "{{ mysql_root_password }}"  # 登录密码:root 密码
任务 7:安装 Nginx
    - name: install nginx  # 任务名称:安装 Nginxyum:  # 使用 yum 模块name: nginx  # 包名:nginxstate: present  # 确保安装
任务 8:启动并启用 Nginx 服务
    - name: start nginx  # 任务名称:启动 Nginx 服务service:  # 使用 service 模块name: nginx  # 服务名:nginxstate: started  # 状态:启动enabled: yes  # 开机自启:启用
任务 9:准备 Nginx 默认页面(存在路径笔误)
    - name: prepare file  # 任务名称:准备文件(默认首页)copy:  # 使用 copy 模块创建文件content: from nginx  # 文件内容:字符串 "from nginx"dest: /user/share/nginx/html/index.html  # 目标路径(注:路径有误,应为 /usr/share/nginx/html/index.html)
任务 10:安装 PHP 及相关组件
    - name: install php  # 任务名称:安装 PHP 相关包yum:  # 使用 yum 模块name: php,php-fpm,php-mysqlnd  # 包列表:PHP 解释器、PHP-FPM 进程管理器、PHP 连接 MySQL 的扩展state: present  # 确保安装
任务 11:修改 PHP-FPM 运行用户 / 组
    - name: modify running user for php  # 任务名称:修改 PHP-FPM 的运行用户和组lineinfile:  # 使用 lineinfile 模块修改配置文件path: /etc/php-fpm.d/www.conf  # 目标配置文件路径regexp: "{{ item}} = "  # 匹配行的正则:以 "user = " 或 "group = " 开头的行line: "{{ item }} = nginx"  # 替换后的行:将用户/组改为 nginxloop:  # 循环:分别处理 user 和 group- user- group

作用:让 PHP-FPM 与 Nginx 使用相同的用户(nginx),避免文件权限问题

任务 12:启动并启用 PHP-FPM 服务
    - name: start php-fpm.service  # 任务名称:启动 PHP-FPM 服务service:  # 使用 service 模块name: php-fpm  # 服务名:php-fpmstate: started  # 状态:启动enabled: yes  # 开机自启:启用
任务 13:配置 Nginx 支持 PHP
    - name: config php for nginx  # 任务名称:配置 Nginx 处理 PHP 请求copy:  # 使用 copy 模块复制配置文件src: php.conf  # 本地源文件:php.conf(需在 Ansible 控制节点的指定路径)dest: /etc/nginx/default.d/php.conf  # 目标路径:Nginx 默认配置目录下的 php.conf

作用:添加 Nginx 解析 PHP 的规则(如将 .php 请求转发给 PHP-FPM 处理)

任务 14:重启 Nginx 使配置生效
    - name: restarted nginx  # 任务名称:重启 Nginxservice:  # 使用 service 模块name: nginx  # 服务名:nginxstate: restarted  # 状态:重启(使新配置生效)

第二部分:deploy web app(部署 Web 应用:WordPress)

- name: deploy web app  # Play 名称:部署 Web 应用hosts: lnmp  # 目标主机组:仍为 lnmp(与上一个 play 相同)vars:  # 变量定义:应用相关配置blog_vhost: blog.yy.cloud  # WordPress 虚拟主机域名tasks:  # 任务列表:部署步骤
任务 1:准备 WordPress 虚拟主机配置
    - name: prepare vhost for wordpress  # 任务名称:准备 WordPress 的虚拟主机配置template:  # 使用 template 模块(支持变量替换)src: vhost-wordpress.conf.j2  # 本地模板文件:vhost-wordpress.conf.j2(含变量,如 {{ blog_vhost }})dest: /etc/nginx/conf.d/vhost-wordpress.conf  # 目标路径:Nginx 虚拟主机配置文件

作用:生成针对 WordPress 的 Nginx 虚拟主机配置(如域名、根目录、PHP 解析规则等)

任务 2:创建 WordPress 网站根目录
    - name: create /usr/share/nginx/html/{{ blog_vhost }}  # 任务名称:创建网站根目录file:  # 使用 file 模块path: /usr/share/nginx/html/{{ blog_vhost }}  # 路径:引用 blog_vhost 变量(如 /usr/share/nginx/html/blog.yy.cloud)state: directory  # 确保为目录(不存在则创建)
任务 3:解压 WordPress 程序包
    - name: Unarchive a wordpress file  # 任务名称:解压 WordPress 文件unarchive:  # 使用 unarchive 模块解压文件src: wordpress-4.9.4-zh_CN.zip  # 本地源文件:WordPress 压缩包(需在控制节点)dest: /usr/share/nginx/html/{{ blog_vhost }}/  # 解压目标目录:网站根目录owner: nginx  # 解压后文件的所有者:nginxgroup: nginx  # 解压后文件的所属组:nginx

作用:将 WordPress 程序部署到网站根目录,并设置正确权限

任务 4:重启 Nginx 使虚拟主机配置生效
    - name: restart nginx  # 任务名称:重启 Nginxservice:  # 使用 service 模块name: nginx  # 服务名:nginxstate: restarted  # 状态:重启

总结

整个 Playbook 分两阶段完成部署:

  1. 先安装并配置 LNMP 基础环境(MariaDB、Nginx、PHP),包括数据库用户 / 库创建、服务启动等;
  2. 再部署 WordPress 应用,通过虚拟主机配置、程序解压等步骤使应用可用。

1. 准备项目目录

mkdir blog && cd blogcat > ansible.cfg <<'EOF'
[defaults]
remote_user = laoma
inventory = ./inventory
vault_password_file=./secret.txt[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOFcat > inventory <<'EOF'
blog ansible_host=10.1.8.100
EOF

准备虚拟站点模版

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

配置nginx对接php

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
http://www.xdnf.cn/news/18044.html

相关文章:

  • 【运维实战】系统全链路监测方案~架构到实践
  • linux:告别SSH断线烦恼,Screen命令核心使用指南
  • 计算机视觉(9)-实践中遇到的问题(六路相机模型采集训练部署全流程)
  • Day119 持续集成docker+jenkins
  • 机器学习之数据预处理(二)
  • 探索性测试:灵活找Bug的“人肉探测仪”
  • 双通道审核智能合约更新路径:基于区块链与AI融合的编程范式分析
  • gflags框架安装与使用
  • [激光原理与应用-296]:理论 - 非线性光学 - 线性光学与非线性光学对比
  • 《亚矩阵云手机重构出租接单:KVM 虚拟化与边缘计算驱动的设备替代技术路径》
  • leetcode43. 字符串相乘
  • 06.文件权限管理
  • 从 UI 角度剖析蔬菜批发小程序的设计之道——仙盟创梦IDE
  • Nextcloud容器化部署革新:Docker+Cpolar构建高效私有云远程访问新架构
  • 构建经典PyTorch框架卷积神经网络参数demo
  • Python 调试工具的高级用法
  • 原子指标、派生指标和复合指标
  • 【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
  • 项目发布上线清单
  • 数据链路层(2)
  • JavaScript 性能优化实战大纲
  • Go语言企业级权限管理系统设计与实现
  • Pulsar存储计算分离架构设计之存储层BookKeeper(上)
  • 【165页PPT】锂电池行业SAP解决方案(附下载方式)
  • 2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
  • 海洋牧场:引领渔业从传统到现代的华丽跨越
  • 【LeetCode】10. 正则表达式匹配
  • [GLM-4.5] LLM推理服务器(SGLang/vLLM) | 工具与推理解析器
  • 云计算-k8s实战指南:从 ServiceMesh 服务网格、流量管理、limitrange管理、亲和性、环境变量到RBAC管理全流程
  • Tomcat Endpoint的核心概念和实现细节