项目实战:ansible 一键部署个人博客-角色版-开发手册

WordPress 一键部署 Playbook - 角色化版本 - 开发手册

一、手册概述

本手册旨在说明基于 Ansible 角色(Role)架构的 WordPress 自动化部署方案。该方案在原有 LNMP(Linux+Nginx+MariaDB+PHP)架构基础上,通过角色化设计进一步提升代码复用性、可维护性和扩展性,支持 CentOS 7 操作系统,实现企业级博客平台的标准化部署与安全加固。

角色化设计将原有的模块化 Playbook 重构为独立角色,每个组件(如数据库、Web 服务等)封装为角色,便于团队协作和跨项目复用。

二、整体架构与角色设计

1. 技术架构

沿用 LNMP 架构:

  • Linux:CentOS 7 操作系统
  • Nginx:Web 服务器,处理 HTTP 请求
  • MariaDB:数据库服务,存储 WordPress 数据
  • PHP-FPM:PHP 进程管理器,解析动态脚本

2. 角色划分

将部署流程拆分为 5 个独立角色,每个角色负责特定功能:

  • mariadb:数据库部署与安全初始化
  • php:PHP 及扩展组件部署
  • nginx:Nginx 服务部署与配置
  • wordpress:WordPress 应用部署
  • security_wordpress:系统安全加固

3. 设计原则

  • 角色内聚:每个角色专注于单一功能模块
  • 变量分离:角色级变量与全局变量分离,支持灵活配置
  • 幂等性:所有任务支持重复执行,避免副作用
  • 可扩展性:支持通过角色参数调整配置,适应不同环境

三、项目结构设计

# 项目目录结构
blog/
├── ansible.cfg           # Ansible 配置文件
├── inventory             # 主机清单
├── secret.txt            # vault 密码文件
├── deploy_blog.yml       # 主 Playbook
├── group_vars/           # 全局变量
│   ├── all/
│   │   └── vars.yml      # 所有主机共享变量
│   ├── databases/
│   │   └── db.yml        # 数据库相关变量(加密)
│   └── wordpress/
│       └── vars.yml      # WordPress 相关变量
└── roles/                # 角色目录
    ├── mariadb/          # 数据库角色
    │   ├── tasks/
    │   │   └── main.yml  # 数据库部署任务
    ├── php/              # PHP 角色
    │   ├── tasks/
    │   │   └── main.yml  # PHP 部署任务
    ├── nginx/            # Nginx 角色
    │   ├── tasks/
    │   │   └── main.yml  # Nginx 部署任务
    │   ├── files/
    │   │   └── php.conf  # Nginx-PHP 配置文件
    │   └── templates/
    │       └── wordpress.conf.j2  # 虚拟主机模板
    ├── wordpress/        # WordPress 角色
    │   ├── tasks/
    │   │   └── main.yml  # 应用部署任务
    │   └── files/
    │       └── wordpress-4.9.4-zh_CN.zip  # 应用包
    └── security_wordpress/    # 安全加固角色
        └── tasks/
            └── main.yml  # 安全配置任务

四、角色详细设计

1. 基础配置文件

ansible.cfg
[defaults]
remote_user = laoma
inventory = ./inventory
vault_password_file=./secret.txt
roles_path = ./roles  # 指定角色路径

[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
inventory
[databases]
blog

[php]
blog

[webservers]
blog

[wordpress]
blog

2. 角色实现

角色:mariadb(数据库部署)

功能:安装 MariaDB、安全初始化。

tasks/main.yml

- 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@host 密码
  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 }}"

变量配置(group_vars/databases/db.yml):

# 加密前内容
db_root_password: "Root@Db2025!"
wordpress_db_name: "wordpress"
wordpress_user_name: "wordpress"
wordpress_user_password: "Laoma@Db2025!"

加密命令

ansible-vault encrypt group_vars/databases/db.yml
角色:php(PHP 部署)

功能:安装 PHP-FPM 及 WordPress 所需扩展。

tasks/main.yml

- name: 安装PHP、PHP-FPM及依赖扩展
  yum:
    name:
      - php
      - php-fpm
      - php-mysqlnd
      - php-gd
      - php-xml
      - php-mbstring
    state: present

- name: 启动PHP-FPM服务
  service:
    name: php-fpm
    state: started
    enabled: yes
角色:nginx(Nginx 部署)

功能:安装 Nginx、配置虚拟主机及 PHP 对接。

tasks/main.yml

- name: 安装EPEL源
  yum:
    name: epel-release
    state: present

- name: 安装Nginx
  yum:
    name: nginx
    state: present

- name: 启动Nginx服务
  service:
    name: nginx
    state: started
    enabled: yes

- name: 配置Nginx对接PHP
  copy:
    src: php.conf
    dest: /etc/nginx/default.d/php.conf
  notify: 重启Nginx

- name: 部署虚拟主机配置
  template:
    src: wordpress.conf.j2
    dest: /etc/nginx/conf.d/wordpress.conf
  notify: 重启Nginx

files/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;
}

templates/wordpress.conf.j2

server {
    listen       80;
    server_name  {{ blog_virtual_hostname }};
    root         {{ wordpress_install_dir }};
    index index.php index.html;

    include /etc/nginx/default.d/*.conf;
    
    access_log  /var/log/nginx/access-{{ blog_virtual_hostname }}.log;
    error_log /var/log/nginx/error-{{ blog_virtual_hostname }}.log;
}

handlers/main.yml

- name: 重启Nginx
  service:
    name: nginx
    state: restarted
角色:wordpress(应用部署)

功能:部署 WordPress 代码、配置数据库连接、调整权限。

tasks/main.yml

- name: 解压WordPress至网站根目录
  unarchive:
    src: wordpress-{{ wordpress_version }}-zh_CN.zip
    dest: /usr/share/nginx/html/
    owner: nginx
    group: nginx
    creates: "{{ wordpress_install_dir }}"

- name: 复制配置样本
  command: cp {{ wordpress_install_dir }}/wp-config-sample.php {{ wordpress_install_dir }}/wp-config.php
  args:
    creates: "{{ wordpress_install_dir }}/wp-config.php"

- name: 配置数据库连接
  lineinfile:
    path: "{{ wordpress_install_dir }}/wp-config.php"
    regexp: "{{ item.regexp }}"
    line: "{{ item.line }}"
  loop:
    - { regexp: "define\\('DB_NAME', 'database_name_here'\\);", line: "define('DB_NAME', '{{ wordpress_db_name }}');" }
    - { regexp: "define\\('DB_USER', 'username_here'\\);", line: "define('DB_USER', '{{ wordpress_user_name }}');" }
    - { regexp: "define\\('DB_PASSWORD', 'password_here'\\);", line: "define('DB_PASSWORD', '{{ wordpress_user_password }}');" }

- name: 调整PHP-FPM运行用户为nginx
  lineinfile:
    path: /etc/php-fpm.d/www.conf
    regexp: "{{ item }} = "
    line: "{{ item }} = nginx"
  loop:
    - user
    - group
  notify: 重启PHP-FPM

handlers/main.yml

- name: 重启PHP-FPM
  service:
    name: php-fpm
    state: restarted

变量配置(group_vars/all/vars.yml):

wordpress_version: "4.9.4"
wordpress_install_dir: /usr/share/nginx/html/wordpress

变量配置(group_vars/wordpress/vars.yml):

blog_virtual_hostname: blog.laoma.cloud
角色:security_wordpress(安全加固)

功能:配置防火墙、隐藏版本信息、禁用 PHP 危险函数。

tasks/main.yml

- name: 启动防火墙
  service:
    name: firewalld
    enabled: yes
    state: started

- name: 开放80端口
  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/main.yml

- name: 重启Nginx
  service:
    name: nginx
    state: restarted

- name: 重启PHP-FPM
  service:
    name: php-fpm
    state: restarted

3. 主 Playbook(deploy_blog.yml)

- name: 部署数据库
  hosts: databases
  roles:
    - mariadb
  tasks:
  	- name: 创建WordPress数据库
      mysql_db:
        name: "{{ wordpress_db_name }}"
        state: present
        login_user: root
        login_password: "{{ db_root_password }}"
    
    - name: 创建数据库用户并授权
      mysql_user:
        name: "{{ wordpress_user_name }}"
        password: "{{ wordpress_user_password }}"
        priv: "{{ wordpress_db_name }}.*:ALL"
        host: "localhost"
        state: present
        login_user: root
        login_password: "{{ db_root_password }}"

- name: 部署PHP
  hosts: php
  roles:
    - php

- name: 部署Nginx
  hosts: webservers
  roles:
    - nginx

- name: 部署WordPress
  hosts: wordpress
  roles:
    - wordpress

- name: 安全加固
  hosts: php,webservers
  roles:
    - security_wordpress

五、执行与验证

1. 执行部署

ansible-playbook deploy_blog.yml

2. 服务状态检查

# 检查Nginx状态
systemctl status nginx

# 检查PHP-FPM状态
systemctl status php-fpm

# 检查MariaDB状态
systemctl status mariadb

3. 访问验证

通过浏览器访问服务器 IP 地址,应显示 WordPress 安装页面。

4. 权限检查

ls -ld /usr/share/nginx/html/wordpress
# 预期输出:属主和属组为nginx,权限755

六、维护与扩展

1. 版本升级

  • WordPress 升级
    1. 替换 roles/wordpress/files/ 下的安装包
    2. 更新 group_vars/all/vars.yml 中的 wordpress_version 变量
    3. 重新执行 Playbook
  • 组件升级:调整角色中 yum 模块的 name 参数指定版本(需测试兼容性)。

2. 配置调整

  • 数据库参数:修改 group_vars/databases/db.yml
  • 域名 / 目录:修改 group_vars/wordpress/vars.yml 中的相关变量
  • 端口配置:修改 nginx/templates/wordpress.conf.j2 中的 listen 参数

3. 故障排查

  • 日志位置:
    • Nginx:/var/log/nginx/error.log
    • PHP-FPM:/var/log/php-fpm/www-error.log
    • MariaDB:/var/log/mariadb/mariadb.log
  • 检查 Ansible 执行输出,定位失败任务及原因。

七、总结

角色化版本通过将功能模块封装为独立角色,进一步提升了部署方案的模块化程度和可复用性。每个角色可单独维护、测试和升级,适合团队协作场景。

实际生产环境中,建议结合企业安全规范补充以下配置:

  • 数据库远程访问限制
  • SSL/TLS 证书配置(HTTPS)
  • 定期备份策略
  • 更严格的文件权限控制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值