介绍
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_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
模块在克隆与资源库的Drupal的最新稳定版本http://git.drupal.org/project/drupal.git
。 下载的文件被放置在/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
应该用来运行这个剧本的所有任务
- 将默认值设置为在各种角色中使用的变量
- 运行所有角色
添加以下代码到它:
---
- 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安装。