在运维工作中,如何用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 密钥并分发公钥:
-
在控制节点上生成 SSH 密钥对(如果尚未生成):
ssh-keygen -t rsa -b 4096(按提示操作,通常直接回车即可)
-
将公钥复制到目标主机:
ssh-copy-id your_username@your_target_host_ip -
确保目标主机的 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.j2 和 wordpress.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:
- 将主题和插件的 ZIP 文件放在控制节点的某个目录下。
- 使用
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,可以实现高效、可复用的自动化部署流程。这种方式不仅减少了手动操作的繁琐性,还提高了部署的稳定性和一致性。

浙公网安备 33010602011771号