如何创建AnsiblePlaybook以在Ubuntu14.04上自动安装Drupal

来自菜鸟教程
跳转至:导航、​搜索

介绍

Ansible 是一种配置管理工具,系统管理员使用它来自动化基础设施管理活动。

Ansible 仅使用 SSH 远程运行命令,因此不需要远程服务器上的代理。 当您不想在托管服务器上安装代理时,这使得 Ansible 优于 Puppet 或 Chef 等其他流行工具。

此外,使用 Ansible 更容易上手,因为它使用 YAML(另一种标记语言),它比其他工具使用的更强大的编程语言更简单。

Drupal 是一种流行的 CMS,其安装耗时,但易于自动化。 在本教程中,我们将创建一个 Ansible Playbook,它可以自动安装和配置 Drupal 及其在运行 Ubuntu 14.04 的系统上的所有依赖项。

先决条件

您将需要以下内容:

  • Ubuntu 14.04 服务器(可通过 SSH 访问); 此服务器将运行 Ansible 和 Drupal 的本地副本
  • 可选:要安装 Drupal 的其他 Ubuntu 14.04 服务器
  • 每台服务器上有一个 sudo 用户; 您应该为要安装 Drupal 的每台服务器使用 相同的用户名相同的密码
  • 对 Drupal 安装如何工作的基本了解。 你可以参考How To Install Drupal on an Ubuntu 14.04 Server with Apache,虽然你不需要预先安装 Drupal

第 1 步 — 安装 Ansible

Ansible 在 apt-get 使用的默认存储库中不可用。 因此,添加存储库 ppa:rquillo/ansible

sudo add-apt-repository ppa:rquillo/ansible

出现提示时按 ENTER。

更新软件包列表。

sudo apt-get update

安装 Ansible。

sudo apt-get install ansible

第 2 步 — 为 Playbook 创建目录

Ansible 的指令集称为剧本。 将所有剧本存储在一个目录中是个好主意。 创建一个名为 MyPlaybooks 的目录。

mkdir ~/MyPlaybooks

让我们将我们的剧本命名为 drupal_setup。 创建一个名为 drupal_setup 的新目录。

mkdir ~/MyPlaybooks/drupal_setup

第 3 步 — 创建主机文件

每个 playbook 通常都有一个 hosts 文件,其中包含它应该使用的服务器的名称。

在本教程中,我们将在 localhost 和另一台服务器 drupal_server 上安装 Drupal。 您可以随意向此文件添加更多服务器。 请记住,您添加的每台服务器都应该可以通过 SSH 访问。

使用 nano 创建和编辑名为 hosts 的文件。

nano ~/MyPlaybooks/drupal_setup/hosts

让它有以下内容:

[drupal_hosts]
localhost
drupal_server_ip

您应该将 drupal_server_ip 替换为您的第二台服务器的 IP 地址。 您可以在此处列出任意数量的 IP 地址; 你可以使用这个剧本在任意数量的 Ubuntu 14.04 服务器上安装 Drupal。

注意: hosts 文件是你应该更新的文件,如果你想在未来重用这个剧本来配置更多的 Drupal 服务器。 请注意,在重新运行 playbook 之前,您应该从列表中删除已配置的服务器,并添加新的服务器 IP。

保存并关闭文件。

第 4 步 — 创建角色以进行 apt-get update

创建一个新目录来存储 Playbook 的所有角色。

mkdir ~/MyPlaybooks/drupal_setup/roles

我们需要 apt-get 在执行任何其他操作之前更新服务器,因此为角色 update 创建一个目录。

mkdir ~/MyPlaybooks/drupal_setup/roles/update

每个角色都有一个或多个任务。 创建一个名为 tasks 的目录来保存与此角色关联的所有任务。

mkdir ~/MyPlaybooks/drupal_setup/roles/update/tasks

使用 nano 创建和编辑名为 main.yml 的新任务文件。 这是告诉 Ansible 在执行此角色时要做什么的文件。

nano ~/MyPlaybooks/drupal_setup/roles/update/tasks/main.yml

在这个文件中,使用 Ansible 的 apt 模块来更新系统:

---

- name: apt-get update the server
  apt: update_cache=yes

确保您的文件没有任何多余的空格; Ansible 对此很挑剔。 保存并关闭文件。

第 5 步 — 创建一个角色来设置 PHP

为角色 php 创建一个目录。

mkdir ~/MyPlaybooks/drupal_setup/roles/php

为此角色创建 tasks 目录:

mkdir ~/MyPlaybooks/drupal_setup/roles/php/tasks

Drupal 需要一个配置为使用 PHP 的 Web 服务器。 在本教程中,我们使用 Apache。 当我们安装 PHP 时,Apache 会自动安装,因此我们不需要任何额外的命令。

使用 nano 为 php 角色创建和编辑 main.yml

nano ~/MyPlaybooks/drupal_setup/roles/php/tasks/main.yml

使用 Ansible 的 apt 模块安装 PHP5(及其依赖的包)和 PHP5 GD 库。 将以下内容添加到文件中:

---

- name: Install PHP and associated packages
  apt: name=php5 state=latest

- name: Install PHP GD library
  apt: name=php5-gd state=latest
  notify:
    - Restart Apache

安装 PHP GD 库后必须重新启动 Apache。 因此,这个角色也需要一个处理程序。

一个角色的所有处理程序都存储在一个单独的目录中。 为当前角色创建一个名为 handlers 的目录。

mkdir ~/MyPlaybooks/drupal_setup/roles/php/handlers

使用 nano 创建和编辑 main.yml 文件。

nano ~/MyPlaybooks/drupal_setup/roles/php/handlers/main.yml

向其中添加以下代码:

---

- name: Restart Apache
  service: name=apache2 state=restarted

您已完成 PHP 和 Apache 设置。

第 6 步 — 创建一个角色来设置 MySQL

Drupal 需要一个数据库来存储设置和内容。 在本教程中,我们使用 MySQL。

为此角色及其任务创建目录。

mkdir -p ~/MyPlaybooks/drupal_setup/roles/mysql/tasks

此角色的第一个任务是安装 MySQL 及其依赖项。 使用 nano 创建和编辑名为 setup.yml 的文件。

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/setup.yml

在这个文件中,我们将告诉 Ansible 再次使用 apt 模块来安装:

  • mysql服务器
  • libapache2-mod-auth-mysql
  • php5-mysql

因此,将以下内容添加到文件中:

---

- name: Install MySQL server
  apt: name=mysql-server state=latest

- name: Install Apache module for MySQL authentication
  apt: name=libapache2-mod-auth-mysql state=latest

- name: Install MySQL module for PHP
  apt: name=php5-mysql state=latest

我们的角色还有一个任务文件。 由于 Drupal 需要自己的 MySQL 数据库和数据库用户,我们将创建一个单独的任务文件来创建它们。 使用 nano 创建和编辑名为 create_db.yml 的文件。

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/create_db.yml

Ansible 具有可让您管理 MySQL 的模块。 在此任务中,我们将使用以下模块:

  • mysql_db - 为 Drupal 创建一个新数据库。
  • mysql_user 创建一个新用户并允许它访问数据库。

在我们使用 mysql_dbmysql_user 之前,我们应该确保在远程主机上安装了 Python MySQLdb 包。 使用apt模块安装。

将以下内容添加到文件中:

---
- name: Install Python MySQLdb
  apt: name=python-mysqldb state=latest

- name: Create the Drupal database
  mysql_db: db={{ db_name }} state=present

- name: Create the Drupal user
  mysql_user: >
    name={{ db_user }}
    password={{ db_password }}
    priv={{ db_name }}.*:ALL
    host=localhost

请注意,包含在 {{ }} 中的字符串表示变量。 在这个任务中,我们有变量 模板:Db user模板:Db password模板:Db name。 我们将在后面的步骤中设置这些变量的值。

接下来,我们需要让 Ansible 知道这个角色有两个任务。 为此,我们创建了一个 main.yml 文件。

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/main.yml

将以下代码添加到该文件中:

---

- include: setup.yml
- include: create_db.yml

第 7 步 — 创建角色以安装 Drupal

现在是时候继续安装 Drupal 本身了。

为此角色及其任务创建目录。

mkdir -p ~/MyPlaybooks/drupal_setup/roles/drupal/tasks

使用 nano 创建和编辑名为 main.yml 的任务文件。

nano ~/MyPlaybooks/drupal_setup/roles/drupal/tasks/main.yml

在这个任务中,我们将告诉 Ansible 执行以下操作:

  • 在远程主机上安装 git。 这是必要的,因为我们将使用 Ansible 的 git 模块
  • 使用 Ansible 的 git 模块从其位于 http://git.drupal.org/project/drupal.git 的存储库中克隆最新的稳定版本的 Drupal。 下载的文件放在/var/www/html/drupal
  • 从默认文件创建 settings.phpservices.yml 文件
  • 更新settings.phpservices.ymlsites/default/files权限

将以下代码添加到文件中:

---

- name: Install git
  apt: name=git state=latest

- name: Clone Drupal
  git: >
    repo=http://git.drupal.org/project/drupal.git
    dest=/var/www/html/drupal/
    update=no

- name: Create settings.php
  command: cp /var/www/html/drupal/sites/default/default.settings.php /var/www/html/drupal/sites/default/settings.php

- name: Create services.yml
  command: cp /var/www/html/drupal/sites/default/default.services.yml /var/www/html/drupal/sites/default/services.yml

- name: Update permissions of settings.php
  file: path=/var/www/html/drupal/sites/default/settings.php mode=777

- name: Update permissions of services.yml
  file: path=/var/www/html/drupal/sites/default/services.yml mode=777

- name: Update permissions of files directory
  file: >
    path=/var/www/html/drupal/sites/default/files
    mode=777
    state=directory
    recurse=yes

在每台服务器(在每台服务器上,而不是通过 Ansible)上完成浏览器安装后,您需要稍后更新这些文件的权限。

第 8 步 — 创建一个文件以使用所有角色

至此,我们所有的角色都准备好了。 我们现在需要使用它们。

使用 nano 创建一个名为 site.yml 的文件。 这是我们将使用 Ansible 实际运行的文件。

nano ~/MyPlaybooks/drupal_setup/site.yml

在此文件中,我们执行以下活动:

  • 指定此 Playbook 将在其上运行的主机
  • 指定应使用 sudo 运行此 Playbook 的所有任务
  • 为各种角色中使用的变量设置默认值
  • 运行所有角色

向其中添加以下代码:

---

- hosts: drupal_hosts

  sudo: yes

  vars:
    - db_name: drupal
    - db_user: drupal_user
    - db_password: drupal_db_pass

  roles:
    - update
    - php
    - mysql
    - drupal

确保将变量 db_password 的值更改为 drupal_db_pass 以外的值。 您也可以自由更改其他两个变量的值以匹配您的偏好。

第 9 步 — 建立 SSH 连接

在运行 Playbook 之前,您的 ~/.ssh/known_hosts 文件应该为 hosts 文件中提到的每个主机都有一个条目。

一种简单的方法是使用 SSH 从该服务器连接到 ~/MyPlaybooks/drupal_setup/hosts 文件中列出的每个服务器一次。

使用以下命令通过 SSH 连接到 localhost

ssh localhost

如果这是您第一次以这种方式连接到服务器,您将收到一条消息提示:

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is b1:18:3d:19:15:21:39:5a:f7:9f:3c:37:68:ba:62:01.
Are you sure you want to continue connecting (yes/no)?

一旦你说 yes,你会收到一条信息:

Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.

连接到 hosts 文件中列出的任何其他服务器:

ssh drupal_sudo_user@drupal_server_ip

确保将用户名和 IP 地址替换为每台服务器的实际信息。 请记住,每个服务器的 sudo 用户名(示例中为 drupal_sudo_user)和密码应该相同,包括 localhost

注意: 您可以将 Ansible 服务器的 sudo 用户的 SSH 公钥复制到每个托管服务器上的 drupal_sudo_user's authorized_keys 文件中,而不是使用密码服务器。

连接到每个服务器后,您就可以运行 playbook。

第 10 步 — 运行剧本

Playbook 现在可以进行测试了。 使用 ansible-playbook 命令将其关闭。 -k 选项强制 Ansible 询问 SSH 密码,如果您设置了无密码身份验证,则不需要。 -K 选项强制 Ansible 询问 sudo 密码。

cd ~/MyPlaybooks/drupal_setup/
ansible-playbook -i hosts site.yml -kK

输入 SSH 密码,等待 Playbook 运行。 运行完成后,您将在服务器上安装全新的 Drupal。

注意: 如果您已将来自 Ansible 服务器的 sudo 用户的 SSH 密钥添加到每个托管服务器,则可以省略 -k 标志。

这将需要几分钟的时间来运行,Ansible 将向您展示它在每个步骤中所做的事情。

重要:如果以后想运行这个脚本设置更多的服务器,必须从~/MyPlaybooks/drupal_setup/hosts文件中删除已经设置好的服务器IP地址,或者Ansible将覆盖您自定义的 Drupal 站点。

第 11 步 — 设置 Drupal

现在,您将能够使用浏览器访问 Drupal 并在 http://your_server_ip/drupal/ 完成基于浏览器的安装。

如果您在完成 Drupal 的浏览器安装程序方面需要帮助,请按照 这篇文章 中的说明进行操作。

您的数据库设置将是您在 ~/MyPlaybooks/drupal_setup/site.yml 文件的 vars 部分中设置的变量。

仔细检查每台服务器是否已成功安装 Drupal。

第 12 步 — 清理主机列表

现在是从 ~/MyPlaybooks/drupal_setup/hosts 文件中删除主机的好时机。 这样,如果再次运行 playbook,就不会意外覆盖已设置的主机。

故障排除

请注意,YAML 对空格敏感。 如果您的剧本有问题,您的 .yml 文件中可能有不正确的缩进或多余的空格。

如果您看到如下所示的错误:

fatal: [server-name] => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

这意味着您错过了在 ~/.ssh/known_hosts 文件中为一个或多个主机添加条目。

您需要先手动建立到 localhost 或目标远程服务器的 SSH 连接。 然后尝试再次运行 playbook。

结论

通过本教程,您学会了创建一个 Ansible 剧本,为您设置 Drupal,以及 Apache 和 MySQL。 在生产系统中使用此 playbook 之前,您必须进一步构建它以使安装更加安全。 您还可以使用 playbook 中的 Drush 命令来管理 Drupal 安装。