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