如何创建Ansible Playbook来自动在Ubuntu 14.04安装的Drupal

Ansible是一个配置管理工具,系统管理员使用自动化的基础架构管理活动。 Drupal是一个流行的CMS的安装非常耗时,而且易于实现自动化。在本教程中,我们将创建一个Ansible Playbook,自动化Drupal和其所有的依赖在运行的Ubuntu 14.04系统的安装和配置。

介绍

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安装如何工作的基本理解。您可以参考如何在Ubuntu 14.04服务器与Apache上安装的Drupal ,但你不需要预先安装的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的指令集称为playbooks。将所有剧本存储在单个目录中是个好主意。创建一个名为MyPlaybooks。
mkdir ~/MyPlaybooks
让我们命名为剧本drupal_setup 。 创建一个名为一个新的目录drupal_setup
mkdir ~/MyPlaybooks/drupal_setup

第3步 - 创建主机文件

每个剧本通常具有hosts包含它应该使用的服务器的名称的文件。 在本教程中,我们将在本地主机和另外一个服务器,drupal_server安装Drupal的。您可以向此文件中添加更多服务器。记住,您添加的每个服务器都应该可以通过SSH访问。 利用纳米创建和编辑一个文件名为hosts
nano ~/MyPlaybooks/drupal_setup/hosts
让它有以下内容:
[drupal_hosts]
localhost
drupal_server_ip
你应该和你的第二个服务器的IP地址替换Drupal的服务器的 ip。您可以在这里列出任意多的IP地址;您可以使用此手册在任何数量的Ubuntu 14.04服务器上安装Drupal。
注: hosts文件是,如果你想重用这个剧本在未来配置更多的Drupal服务器,你应该更新文件。请注意,您应该从列表中删除已配置的服务器,并添加新的服务器IP,然后重新运行剧本。
保存并关闭文件。

第4步 - 创建一个角色apt-get更新

创建一个新目录以存储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创建和编辑main.yml为PHP的作用。
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及其依赖项。利用纳米创建和编辑一个文件名为setup.yml
nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/setup.yml
在这个文件中,我们将告诉Ansible使用apt再次模块进行安装:
  • mysql-server
  • 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数据库和数据库用户,我们将创建一个单独的任务文件来创建它们。利用纳米创建和编辑一个文件名为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模块在克隆与资源库的Drupal的最新稳定版本http://git.drupal.org/project/drupal.git 。 下载的文件被放置在/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应该用来运行这个剧本的所有任务
  • 将默认值设置为在各种角色中使用的变量
  • 运行所有角色
添加以下代码到它:
---

- 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连接

在运行剧本之前,你~/.ssh/known_hosts的文件应该为每个在提到主机的一个条目hosts文件。 一个简单的方法做,这是一次连接中列出的每个服务器~/MyPlaybooks/drupal_setup/hosts从这个服务器上的文件,使用SSH。 连接到localhost使用命令通过SSH:
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在本例中)和密码应该是每个服务器,包括本地主机相同。
注意:不要使用密码,你可以到复制的Ansible服务器的Sudo用户的SSH公钥drupal_sudo_user's authorized_keys每个受管服务器上的文件。
连接到每个服务器后,即可运行剧本。

第10步 - 运行手册

该手册现在已准备好进行测试。消防它关闭使用ansible-playbook命令。 该-k选项强制Ansible要求输入SSH密码,如果你已经设置了密码认证是没有必要的。 该-K选项强制Ansible要求输入sudo密码。
cd ~/MyPlaybooks/drupal_setup/
ansible-playbook -i hosts site.yml -kK
输入SSH密码,并等待Playbook运行。一旦运行完成,您将在服务器上安装一个新的Drupal。
注意:你可以离开了-k标志,如果你已经添加从Ansible服务器的Sudo用户SSH密钥在每个托管服务器。
这将需要几分钟的时间运行,Ansible将显示它在每个步骤正在做什么。
重要提示:如果您想运行此脚本来建立更多的服务器在未来,你必须删除那些已经从设置服务器的IP地址~/MyPlaybooks/drupal_setup/hosts文件,或者Ansible将覆盖您定制的Drupal网站。

第1步1 - 设置Drupal

现在,你将能够使用浏览器访问Drupal和完成基于浏览器的安装,在http:// your_server_ip /drupal/ 。 如果您需要完成为Drupal浏览器安装程序帮助,在说明书一起跟随这篇文章 。 您的数据库设置将是你在设置的变量vars一节的~/MyPlaybooks/drupal_setup/site.yml文件。 仔细检查每个服务器是否已成功安装Drupal。

第1步2 - 清理主机列表

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

故障排除

请注意,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的文件。 你需要进行手动SSH连接到localhost或目标远程服务器第一。然后尝试再次运行playbook。

结论

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