如何创建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_db
或 mysql_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.php
和services.yml
文件 - 更新
settings.php
、services.yml
、sites/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 安装。