如何创建 Ansible Playbook 以在 Ubuntu 14.04 上自动安装 Drupal

介绍

Ansible 是系统管理员用于自动化基础设施管理活动的配置管理工具。

Ansible 只使用 SSH 来远程执行命令,因此不需要远程服务器上的代理,这使得 Ansible 比其他流行的工具如 Puppet 或 Chef 更优于您不想在管理服务器上安装代理。

此外,开始使用 Ansible 更容易,因为它使用的是 YAML(Yet Another Markup Language),它比其他工具使用的更强大的编程语言更简单。

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

前提条件

您将需要以下内容:

  • Ubuntu 14.04 服务器(可通过 SSH 访问); 此服务器将运行 Ansible 和 Drupal 的本地副本
  • 联合国 可选: 新增 Ubuntu 14.04 服务器, 用于安装 Drupal
  • A [sudo] (https://andsky.com/tech/tutorials/how-to-add-and-delete-users-on-an-ubuntu-14-04-vps] 服务器上的用户;您应该使用同名用户名 和** 同名密码** 用于您要安装 Drupal 的每个服务器
  • 对Drupal装置如何运作的基本理解。 您可以引用 [如何在装有 Apache 的 Ubuntu 14.04 服务器上安装 Drupal (https://andsky.com/tech/tutorials/how-to-install-drupal-on-an-ubuntu-14-04-server-with-apache), 尽管您不需要预先安装 Drupal 。

第1步:安装 Ansible

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

1sudo add-apt-repository ppa:rquillo/ansible

按入时要求。

更新包列表。

1sudo apt-get update

安裝 Ansible。

1sudo apt-get install ansible

步骤 2 — 创建 Playbook 的目录

Ansible 的指令集被称为播放书籍. 将所有播放书籍存储在一个目录中是很好的想法. 创建名为 MyPlaybooks 的目录。

1mkdir ~/MyPlaybooks

让我们将我们的播放簿命名为drupal_setup

1mkdir ~/MyPlaybooks/drupal_setup

步骤 3 — 创建一个主机文件

每个播放簿通常都有一个主机文件,其中包含它应该使用的服务器的名称。

在本教程中,我们将安装Drupal在 localhost 和另一个服务器上, ** drupal_server** . 您可以免费将更多服务器添加到此文件中。

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

1nano ~/MyPlaybooks/drupal_setup/hosts

让它有以下内容:

1[drupal_hosts]
2localhost
3drupal_server_ip

你应该用第二个服务器的IP地址来代替drupal_server_ip;你可以在这里列出你想要的尽可能多的IP地址;你可以使用本书在任何Ubuntu 14.04服务器上安装Drupal。

** 注意: ** 主机文件是您应该更新的文件,如果您想在未来重复使用此播放簿来配置更多Drupal服务器。

保存并关闭文件。

步骤 4 — 创建一个角色来 apt-get 更新

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

1mkdir ~/MyPlaybooks/drupal_setup/roles

我们需要在做任何其他事情之前apt-get更新服务器,所以为更新角色创建一个目录。

1mkdir ~/MyPlaybooks/drupal_setup/roles/update

每个角色都有一个或多个任务. 创建一个名为任务的目录,以保留与该角色相关的所有任务。

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

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

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

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

1---
2
3- name: apt-get update the server
4  apt: update_cache=yes

确保你的文件没有任何额外的白色空间; Ansible对此很挑剔. 保存并关闭文件。

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

创建一个角色目录 php

1mkdir ~/MyPlaybooks/drupal_setup/roles/php

创建该角色的任务目录:

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

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

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

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

使用Ansible的apt模块来安装PHP5(以及它所依赖的软件包),以及PHP5 GD库。

1---
2
3- name: Install PHP and associated packages
4  apt: name=php5 state=latest
5
6- name: Install PHP GD library
7  apt: name=php5-gd state=latest
8  notify:
9    - Restart Apache

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

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

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

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

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

添加以下代码:

1---
2
3- name: Restart Apache
4  service: name=apache2 state=restarted

你已经完成了PHP和Apache的设置。

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

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

创建该角色及其任务的目录。

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

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

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

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

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

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

 1---
 2
 3- name: Install MySQL server
 4  apt: name=mysql-server state=latest
 5
 6- name: Install Apache module for MySQL authentication
 7  apt: name=libapache2-mod-auth-mysql state=latest
 8
 9- name: Install MySQL module for PHP
10  apt: name=php5-mysql state=latest

由于Drupal需要自己的MySQL数据库和数据库用户,我们将创建一个单独的任务文件来创建它们。

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

Ansible 包含允许您管理 MySQL 的模块,在此任务中,我们将使用以下模块:

  • mysql_db - 为 Drupal 创建新数据库. * mysql_user 为创建新用户并允许其访问数据库。

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

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

 1---
 2- name: Install Python MySQLdb
 3  apt: name=python-mysqldb state=latest
 4
 5- name: Create the Drupal database
 6  mysql_db: db={{ db_name }} state=present
 7
 8- name: Create the Drupal user
 9  mysql_user: >
10    name={{ db_user }}
11    password={{ db_password }}
12    priv={{ db_name }}.*:ALL
13    host=localhost

请注意,包含在 {{ }} 中的字符串表示变量. 在此任务中,我们有变量 { db_user }}, { db_password}} 和 `{ db_name }}'。

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

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

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

1---
2
3- include: setup.yml
4- include: create_db.yml

步骤7 — 创建一个角色来安装Drupal

现在是时候开始安装 Drupal 了。

创建该角色及其任务的目录。

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

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

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

在此任务中,我们会告诉 Ansible执行以下操作:

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

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

 1---
 2
 3- name: Install git
 4  apt: name=git state=latest
 5
 6- name: Clone Drupal
 7  git: >
 8    repo=http://git.drupal.org/project/drupal.git
 9    dest=/var/www/html/drupal/
10    update=no
11
12- name: Create settings.php
13  command: cp /var/www/html/drupal/sites/default/default.settings.php /var/www/html/drupal/sites/default/settings.php
14
15- name: Create services.yml
16  command: cp /var/www/html/drupal/sites/default/default.services.yml /var/www/html/drupal/sites/default/services.yml
17
18- name: Update permissions of settings.php
19  file: path=/var/www/html/drupal/sites/default/settings.php mode=777
20
21- name: Update permissions of services.yml
22  file: path=/var/www/html/drupal/sites/default/services.yml mode=777
23
24- name: Update permissions of files directory
25  file: >
26    path=/var/www/html/drupal/sites/default/files
27    mode=777
28    state=directory
29    recurse=yes

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

步骤8 — 创建一个使用所有角色的文件

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

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

1nano ~/MyPlaybooks/drupal_setup/site.yml

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

  • 指定本 Playbook 将运行的主机 * 指定sudo应用于执行本 Playbook 的所有任务 * 设置默认值以用于各种角色的变量 * 运行所有角色

添加以下代码:

 1---
 2
 3- hosts: drupal_hosts
 4
 5  sudo: yes
 6
 7  vars:
 8    - db_name: drupal
 9    - db_user: drupal_user
10    - db_password: drupal_db_pass
11
12  roles:
13    - update
14    - php
15    - mysql
16    - drupal

请确保您将变量db_password的值更改为drupal_db_pass

第9步:建立 SSH 连接

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

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

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

1ssh localhost

如果这是您第一次以这种方式连接到服务器,您将收到一个消息,其中说:

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

一旦你说,你会收到一个消息说:

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

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

1ssh drupal_sudo_user@drupal_server_ip

请记住, sudo 用户名(‘drupal_sudo_user’ 在示例中)和密码应该为每个服务器相同,包括 localhost

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

一旦你连接到每个服务器,你已经准备好运行播放簿。

第10步:运行Playbook

Playbook 现在已经准备好进行测试。使用ansible-playbook命令将其关闭。-k选项迫使 Ansible 请求 SSH 密码,如果您已设置了无密码身份验证,则不需要。

1cd ~/MyPlaybooks/drupal_setup/
2ansible-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 Setup Page

如果您需要帮助完成 Drupal 的浏览器安装程序,请遵循 本文中的说明。

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

双重检查每个服务器是否成功安装了 Drupal。

第12步:清理主机列表

现在是从~/MyPlaybooks/drupal_setup/hosts文件中删除主机的好时机,这样一来,如果你重新运行播放簿,你就不会意外地重写你已经设置的主机。

解决问题

请注意,YAML 是白空间敏感的。如果您在播放本上遇到问题,您可能在您的 .yml 文件中有不当的插入或额外的空间。

如果你看到一个错误,看起来像:

1fatal: [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 文件中添加一个或多个主机的条目。

您需要先将手动的 SSH 连接到本地主机或目标远程服务器,然后再尝试运行播放簿。

结论

借助本教程,您已经学会了如何创建一个为您设置Drupal的Ansible播放簿,以及Apache和MySQL。在您在生产系统中使用这个播放簿之前,您将不得不进一步建立它来使安装更安全。

Published At
Categories with 技术
comments powered by Disqus