如何使用Ansible在Ubuntu14.04上自动安装WordPress
介绍
Ansible 是一种简单、无代理的自动化基础架构方式。 如果您发现自己一遍又一遍地部署 WordPress,Ansible 可以为您节省大量时间。
使用几行 YAML(一种简单的标记语言),我们将自动执行在新的 Ubuntu 14.04 服务器上设置 WordPress 的典型繁琐过程。 我们将根据 本教程 中概述的过程或多或少地安装 WordPress,但会自动安装。
我们将使用两台服务器:一台运行 Ansible 的构建服务器,以及一台使用 Ansible 安装 WordPress 的目标服务器。
先决条件
为了完成本教程,您需要进行以下设置:
- 运行 Ubuntu 14.04 的构建服务器。 我们将在此服务器上安装 Ansible(在本教程中称为 build-server)。 我们将登录到这台服务器,本教程的所有文件和命令都将在这台服务器上运行
- 运行 Ubuntu 14.04 的目标服务器。 我们将在此服务器上安装 WordPress(通过 Ansible)(在本教程中称为 wordpress-server)
- 为两台服务器配置的 Sudo 非 root 用户
- 将 build-server sudo 用户的 SSH 密钥添加到 wordpress-server 的 sudo 用户的 authorized_keys。 您可以按照 本教程 进行设置。 您应该从 build-server 运行教程并将密钥上传到您的 wordpress-server
(可选)无密码 sudo 访问
在 wordpress-server 上使用无密码 sudo 访问会 更快 但 不安全 。
为了给我们在 wordpress-server 上的 sudo 用户这个权限,我们需要编辑 sudoers 文件。 输入 visudo
编辑 sudoers 文件:
visudo
在最后添加这一行:
sammy ALL=(ALL) NOPASSWD: ALL
这必须是文件中的 最后一行 。 重要的是这是最后一行,否则它将被覆盖。
NB: 始终使用 visudo
命令编辑 sudoers 文件。 这将在保存文件之前验证您的更改 - 这可以避免您不小心将自己完全锁定在机器之外。
完成此操作后,您应该能够在 wordpress-server 上执行以下命令,而无需提供密码:
sudo echo "Hello"
现在,在本教程中,您可以在没有 -K
标志的情况下运行 ansible-playbook
命令,因此您不必手动输入 sudo 密码。
ansible-playbook playbook.yml -i hosts -u sammy
第 1 步 — 安装 Ansible
在本节中,我们将在您的 build-server 上安装 Ansible。
SSH 到你的 build-server 并运行这个命令来安装 Ansible:
sudo apt-get install ansible -y
您可以通过运行以下命令确保安装了 Ansible:
ansible --version
您应该会看到类似以下的输出:
Outputansible 1.5.4
第 2 步 — 设置文件结构
现在我们已经安装了 Ansible,让我们为我们的 Ansible playbook 准备文件结构。
为我们的剧本创建一个目录。
cd ~ mkdir wordpress-ansible && cd wordpress-ansible
cd
进入这个目录并创建两个文件:一个名为 playbook.yml
(这是我们将编写安装 WordPress 的命令的地方),另一个名为 hosts
(这告诉 Ansible运行命令的服务器):
touch playbook.yml touch hosts
将我们的剧本拆分为角色是最佳实践。 您可以将角色视为可重用的模块。 对于这个项目,我们将创建四个角色:
- 服务器
- php
- mysql
- WordPress
从项目根文件夹 (~/wordpress-ansible
) 中,在其中创建一个名为 roles
和 cd
的目录:
mkdir roles && cd roles
我们可以使用一个名为 ansible-galaxy
的 Ansible 工具来引导我们的角色。 对于我们要创建的每个角色,我们将运行 ansible-galaxy init
:
ansible-galaxy init server ansible-galaxy init php ansible-galaxy init mysql ansible-galaxy init wordpress
您会注意到这为我们的每个角色创建了一个完整的文件结构。 这符合 Ansible 的最佳实践。 在大多数情况下,我们将关注每个角色的 tasks/main.yml
文件。
此时我们应该有以下文件结构:
[.] |_ playbook.yml |_ hosts |_ [roles] |_ [server] |_ ... |_ [php] |_ ... |_ [mysql] |_ ... |_ [wordpress] |_ ...
第 3 步 - 编写剧本
在本节中,我们将编写在远程服务器上安装 WordPress 的命令。
清单(主机文件)
Ansible 清单通知 Ansible 我们想要在哪些服务器上安装 WordPress。 我们可以为库存文件 (hosts
) 中定义的服务器或服务器组运行我们的剧本。 我们的库存非常简单。
编辑hosts
:
nano ~/wordpress-ansible/hosts
添加 [wordpress]
行,在其下方添加 wordpress-server 的 IP 地址:
主机
[wordpress] wordpress_server_ip
您可以在 [wordpress]
组下放置多个不同的 IP。 这将导致命令在此处列出的 所有 服务器上运行,前提是您在所有服务器上都设置了访问权限。 这将让您一次在多个不同的服务器上安装 WordPress。
剧本
我们可以将剧本视为 WordPress 应用程序的定义。 我们的剧本将结合我们创建的角色来配置一个有用的应用程序(在本例中是一个 WordPress 站点)。
编辑剧本文件:
nano ~/wordpress-ansible/playbook.yml
添加这些内容,告诉 Ansible 在哪些主机上运行角色(hosts
文件中的 wordpress
主机),以及运行哪些角色:
剧本.yml
- hosts: wordpress roles: - server - php - mysql - wordpress
移动到您的剧本目录:
cd ~/wordpress-ansible/
让我们通过运行 playbook 来确保从 build-server 到 wordpress-server 的基本连接正常工作。 它还不会做任何事情; 它只会测试连接:
ansible-playbook playbook.yml -i hosts -u sammy -K
出现提示时,在 wordpress-server 上输入 sudo 用户的 sudo 密码。
您应该会看到类似以下的输出:
Outputansible-playbook playbook.yml -i hosts -u sammy -K PLAY [wordpress] ************************************************************** GATHERING FACTS *************************************************************** ok: [188.166.68.134] PLAY RECAP ******************************************************************** 188.166.68.134 : ok=1 changed=0 unreachable=0 failed=0
这表明我们能够连接到服务器。 但是,我们还没有定义任何播放,所以我们的 wordpress-server 上没有执行任何操作。 让我们通过填写四个角色的详细信息来解决这个问题。
如果这不成功,请仔细检查您是否可以使用 SSH 密钥从 build-server SSH 到 wordpress-server。
第 3 步 - 创建角色
服务器
首先要做的事; 让我们设置我们的服务器。 为此,我们将编辑 server
角色。
服务器角色将在目标服务器上安装我们需要的所有软件。 编辑这个文件:
nano roles/server/tasks/main.yml`
添加以下内容; 确保只有一行 ---
(默认情况下应该有一行):
角色/服务器/任务/main.yml
--- - name: Update apt cache apt: update_cache=yes cache_valid_time=3600 sudo: yes - name: Install required software apt: name={{ item }} state=present sudo: yes with_items: - apache2 - mysql-server - php5-mysql - php5 - libapache2-mod-php5 - php5-mcrypt - python-mysqldb
这将执行以下操作:
- 更新 apt-cache (
apt-get update
) apt-get install
Apache、MySQL、PHP 及相关软件
如果您对我们正在安装的详细信息感兴趣,您可以查看 关于如何在 Ubuntu 14.04 上手动安装 LAMP 的教程。
我们现在可以像这样运行我们的剧本:
ansible-playbook playbook.yml -i hosts -u sammy -K
您应该会看到类似这样的输出:
Outputansible-playbook playbook.yml -i hosts -u sammy -K PLAY [wordpress] ************************************************************** GATHERING FACTS *************************************************************** ok: [188.166.68.134] TASK: [server | Update apt cache] ********************************************* ok: [188.166.68.134] TASK: [server | Install required software] ************************************ changed: [188.166.68.134] => (item=apache2,mysql-server,php5-mysql,php5,libapache2-mod-php5,php5-mcrypt,python-mysqldb) PLAY RECAP ******************************************************************** 188.166.68.134 : ok=3 changed=1 unreachable=0 failed=0
运行此程序后,您应该能够在 http://wordpress_server_ip/
访问默认的 Apache 页面。 惊人的。 Apache 现在已在 wordpress-server 上安装并运行。
如果您的构建在 TASK: [server | Update apt cache]
处无限期挂起,这可能表明目标服务器上缺少权限。 确保在 wordpress-server 上正确配置了 sudo 访问。
PHP
让我们整理一下我们的 PHP 需求。 我们将在 PHP 角色中执行此操作。 编辑 PHP 的主要任务文件:
nano roles/php/tasks/main.yml
添加以下内容(同样,---
行应该已经存在):
角色/php/tasks/main.yml
--- - name: Install php extensions apt: name={{ item }} state=present sudo: yes with_items: - php5-gd - libssh2-php
这将安装所需的 PHP 扩展。
MySQL
我们还需要为我们的 WordPress 网站设置一个 MySQL 数据库。 我们将在 mysql
角色中执行此操作。
我们将需要一些变量来解决这个问题。 对于角色,您可以为 defaults/main.yml
文件中的任何变量指定默认值。
nano roles/mysql/defaults/main.yml
按该顺序添加您的数据库名称、数据库用户名和数据库密码(您要创建的)。 确保选择安全的 wp_db_password
。
角色/mysql/defaults/main.yml
--- wp_mysql_db: wordpress wp_mysql_user: wordpress wp_mysql_password: wp_db_password
添加任务以创建我们的数据库和访问它的用户。
nano roles/mysql/tasks/main.yml
添加以下内容:
角色/mysql/tasks/main.yml
--- - name: Create mysql database mysql_db: name={{ wp_mysql_db }} state=present - name: Create mysql user mysql_user: name={{ wp_mysql_user }} password={{ wp_mysql_password }} priv=*.*:ALL
此角色执行以下操作:
- 创建一个 MySQL 数据库
- 创建 MySQL 用户
- 授予该用户访问我们数据库的权限
变量是从我们之前的文件中自动提取的,因此您无需在此处更改任何内容。
您可能对加密密码感兴趣。 Ansible 为此提供了 ansible-vault
作为实用程序,但是对 ansible-vault
的完整讨论超出了本教程的范围。
WordPress
而现在,我们一直在等待的那一刻...... WordPress!
安装服务器要求后,我们可以设置 WordPress。 我们将编辑 wordpress
角色。
我们正在向 roles/wordpress/tasks/main.yml
文件中添加一些不同的任务,因此在本节中保持打开状态。
nano roles/wordpress/tasks/main.yml
首先,我们需要将 WordPress 下载到 /tmp
目录(你们中的安全意识会注意到我们禁用了证书验证,这会中断下载):
角色/wordpress/tasks/main.yml
--- - name: Download WordPress get_url: url=https://wordpress.org/latest.tar.gz dest=/tmp/wordpress.tar.gz validate_certs=no sudo: yes
下载后,我们将 gzip 文件解压缩到 /var/www
,即 Apache 用于存储 Web 内容的位置:
角色/wordpress/tasks/main.yml
- name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no sudo: yes
提取文件后,让我们更新 Apache 的默认站点文档根以指向我们的 WordPress 站点:
角色/wordpress/tasks/main.yml
- name: Update default Apache site sudo: yes lineinfile: dest=/etc/apache2/sites-enabled/000-default.conf regexp="(.)+DocumentRoot /var/www/html" line="DocumentRoot /var/www/wordpress" notify: - restart apache sudo: yes
这将更新 Apache 默认站点的 DocumentRoot
以指向我们在 /var/www/wordpress
下载的 WordPress 文件
您会注意到这里我们添加了一个 notify
块。 当您需要执行任务(例如在任务成功完成后重新启动服务)时使用此选项。 notify
处理程序只有在我们的任务是 更改 时才会被 通知 。
我们需要为 restart apache
添加我们的处理程序。 保存到目前为止的内容,然后打开 roles/wordpress/handlers/main.yml
进行编辑:
nano roles/wordpress/handlers/main.yml
添加这些内容:
角色/wordpress/handlers/main.yml
--- - name: restart apache service: name=apache2 state=restarted sudo: yes
当指定 notify: restart apache
的任务发生更改时,将调用此处理程序,导致服务器重新启动 Apache。
配置 WordPress
返回 roles/wordpress/tasks/main.yml
。
最后,我们需要为我们的 WordPress 网站做一些配置:
首先,我们复制示例配置文件:
角色/wordpress/tasks/main.yml
- name: Copy sample config file command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php sudo: yes
更新此文件中的一些常量以匹配我们的数据库信息:
角色/wordpress/tasks/main.yml
- name: Update WordPress config file lineinfile: dest=/var/www/wordpress/wp-config.php regexp="{{ item.regexp }}" line="{{ item.line }}" with_items: - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"} - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"} - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"} sudo: yes
此任务将在我们的配置文件中找到包含以下内容的行:DB_NAME
、DB_USER
和 DB_PASSWORD
,并将它们替换为我们剧本中的变量。
成功完成上述步骤后,我们的 wordpress 角色将包含两个感兴趣的文件。
这是 WordPress 的完整任务文件:
角色/wordpress/tasks/main.yml
--- - name: Download WordPress get_url: url=https://wordpress.org/latest.tar.gz dest=/tmp/wordpress.tar.gz validate_certs=no - name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no sudo: yes - name: Update default Apache site sudo: yes lineinfile: dest=/etc/apache2/sites-enabled/000-default.conf regexp="(.)+DocumentRoot /var/www/html" line="DocumentRoot /var/www/wordpress" notify: - restart apache - name: Copy sample config file command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php sudo: yes - name: Update WordPress config file lineinfile: dest=/var/www/wordpress/wp-config.php regexp="{{ item.regexp }}" line="{{ item.line }}" with_items: - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"} - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"} - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"} sudo: yes
这是重新启动 Apache 的文件(您应该已经创建了):
角色/wordpress/handlers/main.yml
--- - name: restart apache service: name=apache2 state=restarted sudo: yes
我们完成了! 最后一次运行 playbook 以安装和配置 WordPress:
ansible-playbook playbook.yml -i hosts -u sammy -K
您应该能够在线查看您的 WordPress 站点:http://your_server_ip
。
您可以从此处完成手动 WordPress 站点设置。
结论
恭喜! 您现在可以使用单个命令在任何 Ubuntu 14.04 服务器上安装 WordPress 站点:
ansible-playbook playbook.yml -i hosts -u sammy -K
您所要做的就是将目标服务器的 IP 地址添加到您的 hosts
文件中,并确保您的权限设置正确。
下一步
这是一个非常快速的介绍,可帮助您开始使用 Ansible 和 WordPress。 您可能有兴趣研究以下改进:
- 探索 Ansible Galaxy 并了解如何在 Galaxy 上托管自己的角色
- 自动化设置过程,无需手动配置 WordPress 站点