如何使用 Ansible 在 Ubuntu 14.04 上自动安装 WordPress

简介

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_NAMEDB_USERDB_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 网站
Published At
Categories with 技术
comments powered by Disqus