介绍
Ansible是一种简单,无代理的方式来自动化您的基础设施。 如果你发现自己重复部署WordPress,Ansible可以节省你很多时间。
使用几行YAML(一种直接标记语言),我们将在一个新鲜的Ubuntu 14.04服务器上自动执行通常乏味的设置WordPress的过程。 我们将按照规定的程序或多或少安装WordPress 本教程中 ,可自动。
我们将使用两个服务器:运行Ansible的构建服务器,以及我们将使用Ansible安装WordPress的目标服务器。
先决条件
为了完成本教程,您需要进行以下设置:
- 运行Ubuntu 14.04的构建服务器。 我们将在服务器(在本教程作为构建服务器的简称)上安装Ansible。 我们将登录到此服务器,本教程的所有文件和命令都将在此服务器上运行
- 运行Ubuntu 14.04的目标服务器。 我们将在服务器(在本教程为WordPress的服务器简称)上安装WordPress(通过Ansible)
- Sudo非root用户配置的两台服务器
- 构建服务器Sudo用户的SSH密钥添加到你的WordPress服务器的Sudo用户的authorized_keys中。 您可以通过以下设置这 。 您应该运行构建服务器的教程和上传关键看你的WordPress服务器
(可选)无密码sudo访问
它是速度较快,但不太安全的使用你的WordPress服务器上的密码的sudo访问。
为了让我们的用户SudoWordPress的服务器上这privelege,我们需要编辑sudoers文件。 键入visudo
编辑sudoers文件:
visudo
在结尾添加此行:
sammy ALL=(ALL) NOPASSWD: ALL
这必须在该文件中的最后一行 。 重要的是,这是最后一行,否则它将被覆盖。
注意:使用始终编辑sudoers文件visudo
命令。 这将在保存文件之前验证您的更改 - 这可以避免您意外地将自己从机器完全锁定。
一旦你做到了这一点,你应该能够在不提供密码来执行WordPress的服务器上执行以下命令:
sudo echo "Hello"
现在,在本教程中,你可以运行ansible-playbook
没有命令-K
标志,所以你不必手动输入sudo的密码。
ansible-playbook playbook.yml -i hosts -u sammy
第1步 - 安装Ansible
在本节中,我们将构建的服务器上安装Ansible。
SSH到您的构建服务器 ,并运行此命令安装Ansible:
sudo apt-get install ansible -y
您可以通过运行以下命令来确保安装了Ansible:
ansible --version
你应该看到类似的输出:
Outputansible 1.5.4
第2步 - 设置文件结构
现在我们已经安装了Ansible,让我们准备Ansible playbook的文件结构。
为我们的剧本创建目录。
cd ~
mkdir wordpress-ansible && cd wordpress-ansible
cd
到该目录,并创建两个文件:一个叫playbook.yml
(这是我们会写信给安装WordPress的命令)和另一种称为hosts
(这告诉Ansible该服务器上运行命令):
touch playbook.yml
touch hosts
最好的做法是将我们的剧本分解成角色。 您可以将角色视为可重用的模块。 对于这个项目,我们将创建四个角色:
- 服务器
- php
- mysql
- wordpress
从项目的根文件夹( ~/wordpress-ansible
),创建一个目录名为roles
和cd
进去:
mkdir roles && cd roles
我们可以称之为Ansible工具引导我们的角色ansible-galaxy
。 为此,我们要创建的每个角色,我们将运行ansible-galaxy init
:
ansible-galaxy init server
ansible-galaxy init php
ansible-galaxy init mysql
ansible-galaxy init wordpress
你会注意到,这为我们的每个角色创建了一个完整的文件结构。 这是根据Ansible的最佳做法。 在大多数情况下,我们将关注每一个角色的tasks/main.yml
文件。
在这一点上,我们应该有以下文件结构:
[.]
|_ playbook.yml
|_ hosts
|_ [roles]
|_ [server]
|_ ...
|_ [php]
|_ ...
|_ [mysql]
|_ ...
|_ [wordpress]
|_ ...
第3步 - 编写手册
在本节中,我们将编写命令在我们的远程服务器上安装WordPress。
库存(主机文件)
Ansible库存通知Ansible我们有什么服务器,我们要安装WordPress的。 我们可以为我们的库存文件(定义的服务器或服务器组运行我们的剧本hosts
)。 我们的库存很简单。
编辑hosts
:
nano ~/wordpress-ansible/hosts
添加行[wordpress]
,并在它下面,你的WordPress服务器的IP地址:
[wordpress]
wordpress_server_ip
你可以把多个不同的IP地址的下[wordpress]
组。 这会导致这些命令在这里列出的所有服务器上运行,只要你有机会建立在所有服务器上。 这将允许您同时在多个不同的服务器上安装WordPress。
手册
我们可以想出一个playbook作为我们的WordPress应用程序的定义。 我们的剧本将结合我们创建的角色来配置一个有用的应用程序(在这种情况下是一个WordPress网站)。
编辑剧本文件:
nano ~/wordpress-ansible/playbook.yml
添加这些内容,它告诉Ansible哪些主机上运行(该角色wordpress
的那些hosts
文件),并运行其中的角色:
- hosts: wordpress
roles:
- server
- php
- mysql
- wordpress
移至您的剧本目录:
cd ~/wordpress-ansible/
让我们确保我们从构建服务器到WordPress的服务器的作品通过运行剧本基本连接。 它不会做任何事情; 它只是测试连接:
ansible-playbook playbook.yml -i hosts -u sammy -K
提示时WordPress的服务器上你的sudo用户输入sudo的密码。
你应该看到类似的输出:
Outputansible-playbook playbook.yml -i hosts -u sammy -K
PLAY [wordpress] **************************************************************
GATHERING FACTS ***************************************************************
ok: [188.166.68.134]
PLAY RECAP ********************************************************************
188.166.68.134 : ok=1 changed=0 unreachable=0 failed=0
这表明我们能够连接到服务器。 但是,我们还没有定义任何剧本还没有,所以什么也没有我们的WordPress的服务器上执行。 让我们通过填写我们的四个角色的细节来解决这个问题。
如果这不是成功的,仔细检查,你可以从构建服务器到WordPress的服务器使用SSH密钥SSH协议。
第3步 - 创建角色
服务器
第一件事; 让我们设置我们的服务器。 为此,我们将被编辑server
角色。
服务器角色将在目标服务器上安装我们所需的所有软件。 编辑此文件:
nano roles/server/tasks/main.yml`
添加以下内容; 确保有只有一个行---
(应该有一个有默认情况下):
---
- name: Update apt cache
apt: update_cache=yes cache_valid_time=3600
sudo: yes
- name: Install required software
apt: name={{ item }} state=present
sudo: yes
with_items:
- apache2
- mysql-server
- php5-mysql
- php5
- libapache2-mod-php5
- php5-mcrypt
- python-mysqldb
这执行以下操作:
- 更新的apt-缓存(
apt-get update
) -
apt-get install
Apache,MySQL和PHP,以及相关的软件
如果你有兴趣,我们正在安装什么样的细节,你可以看看本教程如何手动在Ubuntu 14.04安装LAMP 。
我们现在可以运行我们的剧本:
ansible-playbook playbook.yml -i hosts -u sammy -K
你应该看到这样的输出:
Outputansible-playbook playbook.yml -i hosts -u sammy -K
PLAY [wordpress] **************************************************************
GATHERING FACTS ***************************************************************
ok: [188.166.68.134]
TASK: [server | Update apt cache] *********************************************
ok: [188.166.68.134]
TASK: [server | Install required software] ************************************
changed: [188.166.68.134] => (item=apache2,mysql-server,php5-mysql,php5,libapache2-mod-php5,php5-mcrypt,python-mysqldb)
PLAY RECAP ********************************************************************
188.166.68.134 : ok=3 changed=1 unreachable=0 failed=0
运行此之后,你应该能够访问默认的Apache网页http:// wordpress_server_ip /
。 真棒。 Apache是目前安装和WordPress的服务器上运行。
如果构建在点无限期挂起TASK: [server | Update apt cache]
TASK: [server | Update apt cache]
,这可能表明缺乏目标服务器上的权限。 确保sudo的访问WordPress的服务器上正确配置。
PHP
让我们整理出我们的PHP需求。 我们将在PHP角色中这样做。 编辑PHP的主要任务文件:
nano roles/php/tasks/main.yml
添加以下(同样, ---
线应该已经在那里):
---
- name: Install php extensions
apt: name={{ item }} state=present
sudo: yes
with_items:
- php5-gd
- libssh2-php
这将安装所需的PHP扩展。
MySQL
我们还需要为我们的WordPress网站设置一个MySQL数据库。 我们将在执行此操作mysql
作用。
我们将需要一些变量为这一个。 对于一个角色,你可以在任何变量指定默认值defaults/main.yml
文件。
nano roles/mysql/defaults/main.yml
添加您的数据库名称,数据库用户名和数据库密码(您要创建的),按此顺序。 请确保你选择一个安全的wp_db_password
。
---
wp_mysql_db: wordpress
wp_mysql_user: wordpress
wp_mysql_password: wp_db_password
添加任务以创建我们的数据库和用户来访问它。
nano roles/mysql/tasks/main.yml
添加以下内容:
---
- name: Create mysql database
mysql_db: name={{ wp_mysql_db }} state=present
- name: Create mysql user
mysql_user:
name={{ wp_mysql_user }}
password={{ wp_mysql_password }}
priv=*.*:ALL
此角色执行以下操作:
- 创建MySQL数据库
- 创建MySQL用户
- 让该用户访问我们的数据库
变量从我们早期的文件中自动提取,因此您不必在此处更改任何内容。
您可能有兴趣加密您的密码。 Ansible提供ansible-vault
作为该实用程序,而是一个完整的讨论ansible-vault
超出了本教程的范围。
WordPress
现在,我们一直在等待... ... WordPress!
随着服务器要求的安装,我们可以设置WordPress。 我们将编辑wordpress
作用。
我们增加了一些不同的任务给roles/wordpress/tasks/main.yml
文件,所以把它打开本节。
nano roles/wordpress/tasks/main.yml
首先,我们需要到WordPress下载到/tmp
目录下(安全意识你们当中会发现,我们已经禁用证书验证,这将中断下载):
---
- name: Download WordPress get_url:
url=https://wordpress.org/latest.tar.gz
dest=/tmp/wordpress.tar.gz
validate_certs=no
sudo: yes
下载完成后,我们提取gzip文件,以/var/www
,即Apache使用用于存储网页内容的位置:
- name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
sudo: yes
提取文件后,让我们更新Apache的默认站点文档根以指向我们的WordPress站点:
- name: Update default Apache site
sudo: yes
lineinfile:
dest=/etc/apache2/sites-enabled/000-default.conf
regexp="(.)+DocumentRoot /var/www/html"
line="DocumentRoot /var/www/wordpress"
notify:
- restart apache
sudo: yes
这将更新DocumentRoot
为Apache的默认站点为指向,我们在下载WordPress的文件/var/www/wordpress
在这里你会发现,我们增加了一个notify
块。 这是当你需要执行的任务,如重新启动服务后,任务成功完成使用。 notify
,如果我们的任务就是改变了处理器将只通知 。
我们需要增加我们的处理程序restart apache
。 保存你所拥有的,到目前为止,开放的roles/wordpress/handlers/main.yml
编辑:
nano roles/wordpress/handlers/main.yml
添加这些内容:
---
- name: restart apache
service: name=apache2 state=restarted
sudo: yes
当一个指定的任务该处理器将被称为notify: restart apache
被改变,从而导致服务器重新启动Apache。
配置WordPress
返回roles/wordpress/tasks/main.yml
。
最后,我们需要为我们的WordPress网站做一些配置:
首先,我们复制示例配置文件:
- name: Copy sample config file
command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
sudo: yes
更新此文件中的一些常量以匹配我们的数据库信息:
- name: Update WordPress config file
lineinfile:
dest=/var/www/wordpress/wp-config.php
regexp="{{ item.regexp }}"
line="{{ item.line }}"
with_items:
- {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
- {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
- {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
sudo: yes
此任务将找到包含行: DB_NAME
, DB_USER
和DB_PASSWORD
在我们的配置文件,并与我们的剧本中的变量替换它们。
成功完成上述步骤后,我们的wordpress角色将包含两个感兴趣的文件。
这里是WordPress的完整任务文件:
---
- name: Download WordPress get_url:
url=https://wordpress.org/latest.tar.gz
dest=/tmp/wordpress.tar.gz
validate_certs=no
- name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
sudo: yes
- name: Update default Apache site
sudo: yes
lineinfile:
dest=/etc/apache2/sites-enabled/000-default.conf
regexp="(.)+DocumentRoot /var/www/html"
line="DocumentRoot /var/www/wordpress"
notify:
- restart apache
- name: Copy sample config file
command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
sudo: yes
- name: Update WordPress config file
lineinfile:
dest=/var/www/wordpress/wp-config.php
regexp="{{ item.regexp }}"
line="{{ item.line }}"
with_items:
- {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
- {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
- {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
sudo: yes
这里是重新启动Apache的文件(您应该已经创建):
---
- name: restart apache
service: name=apache2 state=restarted
sudo: yes
我们完成了! 最后一次运行手册安装和配置WordPress:
ansible-playbook playbook.yml -i hosts -u sammy -K
你应该能够在网上查看你的WordPress网站: http://your_server_ip
。
您可以从这里完成手动WordPress网站设置。
结论
恭喜! 您现在可以使用一个命令在任何Ubuntu 14.04服务器上安装WordPress站点:
ansible-playbook playbook.yml -i hosts -u sammy -K
所有你需要做的就是增加你的目标服务器的IP地址到你的hosts
文件,并确保您的权限设置是否正确。
下一步
这是一个非常快速的介绍,让你开始使用Ansible和WordPress。 您可能有兴趣了解以下改进:
- 探索Ansible Galaxy,了解如何在银河上主持您自己的角色
- 自动化设置过程,以便不需要手动配置您的WordPress站点