介绍
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_db
或mysql_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.php
和services.yml
文件 *更新settings.php
,services.yml
和sites/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 的浏览器安装程序,请遵循 本文中的说明。
您的数据库设置将是您在~/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。在您在生产系统中使用这个播放簿之前,您将不得不进一步建立它来使安装更安全。