作者信息:https://home.cnblogs.com/u/huangjiabobk

在运维工作中,如何用ansible搭建wordpress?

使用 Ansible 搭建 WordPress 是一个典型的自动化运维任务,涉及多个步骤,包括安装依赖组件、配置数据库、部署 WordPress 文件以及配置 Web 服务器等。以下是详细的操作步骤和说明:

1. 环境准备

在开始之前,需要确保以下环境和工具已经准备就绪:

1.1 安装 Ansible

在控制节点(运行 Ansible 的机器)上安装 Ansible。以下是基于不同操作系统的安装方法:

  • 基于 Debian 的系统(如 Ubuntu)

    sudo apt update && sudo apt install ansible
    
  • 基于 Red Hat 的系统(如 CentOS)

    sudo yum install ansible
    
  • MacOS(通过 Homebrew)

    brew install ansible
    
1.2 配置目标主机

确保目标主机(运行 WordPress 的服务器)可以通过 SSH 访问,并且 Ansible 能够通过 SSH 免密登录到目标主机。可以通过以下步骤生成 SSH 密钥并分发公钥:

  1. 在控制节点上生成 SSH 密钥对(如果尚未生成):

    ssh-keygen -t rsa -b 4096
    

    (按提示操作,通常直接回车即可)

  2. 将公钥复制到目标主机:

    ssh-copy-id your_username@your_target_host_ip
    
  3. 确保目标主机的 SSH 服务正常运行,并且防火墙允许 SSH 连接。

1.3 配置 Ansible Inventory

Ansible 使用 Inventory 文件来管理目标主机。编辑 /etc/ansible/hosts 文件或创建一个自定义的 Inventory 文件(如 inventory.ini),并添加目标主机信息。例如:

[wordpress]
your_target_host_ip ansible_user=your_username
2. 编写 Ansible Playbook

Playbook 是 Ansible 的核心,用于定义自动化任务的执行流程。以下是搭建 WordPress 的完整 Playbook 示例。

2.1 创建 Playbook 文件

创建一个名为 wordpress.yml 的文件,用于定义 WordPress 的部署任务。

---
- name: Deploy WordPress
  hosts: wordpress
  become: yes
  vars:
    # 定义变量
    db_name: wordpress
    db_user: wordpress_user
    db_password: "your_secure_password"
    db_root_password: "your_mysql_root_password"
    wp_domain: your_domain.com
    wp_version: "latest"
    wp_dir: /var/www/wordpress

  tasks:
    - name: Update apt cache
      ansible.builtin.apt:
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: Install required packages
      ansible.builtin.apt:
        name:
          - apache2
          - mysql-server
          - php
          - php-mysql
          - php-fpm
          - php-curl
          - php-gd
          - php-mbstring
          - php-xml
          - php-cli
          - unzip
        state: present

    - name: Secure MySQL installation
      ansible.builtin.command: mysql_secure_installation
      args:
        creates: /root/.mysql_secure_installed

    - name: Create MySQL database
      ansible.builtin.mysql_db:
        name: "{{ db_name }}"
        state: present
        login_user: root
        login_password: "{{ db_root_password }}"

    - name: Create MySQL user
      ansible.builtin.mysql_user:
        name: "{{ db_user }}"
        password: "{{ db_password }}"
        priv: "{{ db_name }}.*:ALL"
        state: present
        login_user: root
        login_password: "{{ db_root_password }}"

    - name: Download WordPress
      ansible.builtin.get_url:
        url: "https://wordpress.org/latest.zip"
        dest: /tmp/wordpress.zip

    - name: Extract WordPress
      ansible.builtin.unarchive:
        src: /tmp/wordpress.zip
        dest: "{{ wp_dir }}"
        remote_src: yes

    - name: Copy wp-config.php template
      ansible.builtin.template:
        src: wp-config.php.j2
        dest: "{{ wp_dir }}/wp-config.php"

    - name: Set permissions for WordPress files
      ansible.builtin.file:
        path: "{{ wp_dir }}"
        owner: www-data
        group: www-data
        recurse: yes

    - name: Configure Apache for WordPress
      ansible.builtin.template:
        src: wordpress.conf.j2
        dest: /etc/apache2/sites-available/wordpress.conf

    - name: Enable WordPress site
      ansible.builtin.file:
        src: /etc/apache2/sites-available/wordpress.conf
        dest: /etc/apache2/sites-enabled/wordpress.conf
        state: link

    - name: Disable default Apache site
      ansible.builtin.file:
        path: /etc/apache2/sites-enabled/000-default.conf
        state: absent

    - name: Restart Apache
      ansible.builtin.service:
        name: apache2
        state: restarted
2.2 创建模板文件

Playbook 中使用了两个模板文件:wp-config.php.j2wordpress.conf.j2。这些模板文件用于动态生成 WordPress 的配置文件和 Apache 的虚拟主机配置。

2.2.1 wp-config.php.j2

创建一个名为 wp-config.php.j2 的文件,用于生成 WordPress 的配置文件:

<?php
define('DB_NAME', '{{ db_name }}');
define('DB_USER', '{{ db_user }}');
define('DB_PASSWORD', '{{ db_password }}');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

$table_prefix  = 'wp_';
define('WP_DEBUG', false);

if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');

2.2.2 wordpress.conf.j2

创建一个名为 wordpress.conf.j2 的文件,用于生成 Apache 的虚拟主机配置:

<VirtualHost *:80>
    ServerAdmin webmaster@{{ wp_domain }}
    DocumentRoot {{ wp_dir }}
    ServerName {{ wp_domain }}
    ServerAlias www.{{ wp_domain }}

    <Directory {{ wp_dir }}>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
3. 执行 Playbook

将 Playbook 文件和模板文件保存到控制节点的同一目录下,然后运行以下命令执行 Playbook:

ansible-playbook -i inventory.ini wordpress.yml
  • -i inventory.ini:指定 Inventory 文件路径。
  • wordpress.yml:指定 Playbook 文件。
4. 验证部署结果

部署完成后,访问 http://your_domain.com,你应该能看到 WordPress 的安装界面。按照提示完成剩余的安装步骤,输入管理员用户名、密码和电子邮件地址。

5. 进阶优化
5.1 自定义主题和插件

可以通过以下方式将自定义主题和插件部署到 WordPress:

  1. 将主题和插件的 ZIP 文件放在控制节点的某个目录下。
  2. 使用 unarchive 模块将它们解压到 /var/www/wordpress/wp-content/themes/var/www/wordpress/wp-content/plugins 目录。
5.2 安全加固
  • MySQL 安全:确保 MySQL 的 root 用户密码复杂,并限制远程访问。
  • 文件权限:确保 WordPress 文件的权限正确,防止未授权访问。
  • 防火墙:配置防火墙规则,只允许必要的端口(如 HTTP/HTTPS)对外暴露。
5.3 持续集成/持续部署

可以结合 Jenkins、GitLab CI 等工具,实现代码变更后的自动部署,进一步提升运维效率。

6. 我的总结

综上所述,通过 Ansible 搭建 WordPress,可以实现高效、可复用的自动化部署流程。这种方式不仅减少了手动操作的繁琐性,还提高了部署的稳定性和一致性。

posted @ 2025-03-07 12:50  黄嘉波  阅读(122)  评论(0)    收藏  举报
版权声明:原创作品,谢绝转载!否则将追究法律责任。--作者 黄嘉波