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

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.dtcms.com/a/338195.html

相关文章:

  • django+Vue3实现前后端分离式实时聊天室
  • Java面试考点
  • ​Kali Linux 环境中的系统配置文件与用户配置文件大全
  • MySQL 自增主键满了咋办?
  • PowerBI CrossFilter解决关联关系过滤传播问题
  • 对象存储 COS 端到端质量系列 —— 终端网络诊断工具
  • 【大模型】RAG
  • 明远智睿 RK3588:以技术突破解锁开发新维度
  • 【Python】源码安装python后报错:ModuleNotFoundError: No module named ‘_lzma‘
  • Jenkins持续集成系统
  • github 如何在 readme 显示Star History
  • NL2SQL:从自然语言到SQL查询的深度解析
  • PostgreSQL 从参数调优到 AI 诊断的实战指南
  • Unity开发中的浅拷贝与深拷贝
  • Java获取京东评论数据的实战指南
  • 06.文件权限管理
  • quic协议与应用开发
  • 视觉语言导航(12)——LLM-VLN 4.2
  • 如何部署 PHPWind 8.5 UTF8 论坛?从下载到安装全流程(附安装包下载)
  • GraphPad Prism10.1安装包免费下载中文版下载以及详细安装教程!!
  • Tomcat Wrapper源码解析:深入理解Servlet生命周期与请求分发机制
  • SQL Server 基本语法
  • NodeJs 桌面开发学习 electron.js (一)
  • 黑马java入门实战笔记
  • 【从0到1制作一块STM32开发板】8. PCB添加丝印
  • c++中的auto自动类型推导
  • JVM-类加载详情
  • Mysql——分库分表后id冲突解决方案(即分布式ID的生成方案)
  • 静态网站与动态网站的区别
  • MySQL分库分表实战指南