介绍
Ansible是一种简单,无代理的自动化基础架构方式。如果您发现自己一遍又一遍地部署WordPress,Ansible可以为您节省大量时间。
使用几行YAML(一种直接的标记语言),我们将自动完成在新的Ubuntu 14.04服务器上设置WordPress的繁琐过程。我们将根据本教程中概述的过程或多或少地安装WordPress ,但会自动安装。
我们将使用两个服务器:一个运行Ansible的构建服务器,以及一个使用Ansible安装WordPress的目标服务器。
要完成本教程,您需要进行以下设置:
sudo
命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。)这是更快,但安全性较差使用您的密码的上sudo访问WordPress的服务器。
为了给我们的sudo用户提供wordpress-server这个privelege,我们需要编辑sudoers文件。输入visudo
以编辑sudoers文件:
visudo
最后添加这一行:
sammy ALL=(ALL) NOPASSWD: ALL
这必须是文件中的最后一行。重要的是,这是最后一行,否则将被覆盖。
注意:始终使用visudo
命令编辑sudoers文件。这将在保存文件之前验证您的更改 - 这可以避免您意外地将自己完全锁定在机器之外。
完成此操作后,您应该能够在wordpress-server上执行以下命令而无需提供密码:
sudo echo "Hello"
现在,在本教程中,您可以运行ansible-playbook
不带-K
标志的命令,因此您无需手动输入sudo密码。
ansible-playbook playbook.yml -i hosts -u sammy
在本节中,我们将在您的构建服务器上安装Ansible 。
SSH到您的构建服务器并运行此命令以安装Ansible:
sudo apt-get install ansible -y
您可以通过运行来确保安装Ansible:
ansible --version
您应该看到输出类似于:
Output
ansible 1.5.4
现在我们已经安装了Ansible,让我们为Ansible playbook准备文件结构。
为我们的剧本创建一个目录。
cd ~
mkdir wordpress-ansible && cd wordpress-ansible
cd
进入这个目录并创建两个文件:一个调用playbook.yml
(这是我们将编写安装WordPress的命令)和另一个调用hosts
(这告诉Ansible在哪些服务器上运行命令):
touch playbook.yml
touch hosts
最佳做法是将我们的剧本分成角色。您可以将角色视为可重用模块。对于这个项目,我们将创建四个角色:
在项目的根文件夹(~/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]
|_ ...
在本节中,我们将编写用于在远程服务器上安装WordPress的命令。
Ansible清单通知Ansible我们要安装WordPress的服务器。我们可以为我们的库存文件(hosts
)中定义的服务器或服务器组运行我们的playbooks 。我们的库存非常简单。
编辑hosts
:
nano ~/wordpress-ansible/hosts
添加[wordpress]
和它下方的wordpress-server的IP地址:
[wordpress]
wordpress_server_ip
您可以在该[wordpress]
组下放置许多不同的IP 。如果您在所有服务器上设置了访问权限,这将导致命令在此处列出的所有服务器上运行。这将允许您一次在多个不同的服务器上安装WordPress。
我们可以将剧本视为WordPress应用程序的定义。我们的剧本将结合我们创建的角色来配置有用的应用程序(在本例中为WordPress站点)。
编辑剧本文件:
nano ~/wordpress-ansible/playbook.yml
添加这些内容,这告诉Ansible哪些主机上运行角色(在wordpress
那些中hosts
哪些角色要运行文件),和运行哪些角色:
- hosts: wordpress
roles:
- server
- php
- mysql
- wordpress
移动到您的playbook目录:
cd ~/wordpress-ansible/
让我们通过运行playbook 确保从构建服务器到wordpress-server的基本连接。它还没有做任何事情; 它只是测试连接:
ansible-playbook playbook.yml -i hosts -u sammy -K
出现提示时,在wordpress-server上输入sudo用户的sudo密码。
您应该看到输出类似于:
Output
ansible-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-server上没有执行任何操作。让我们通过填写我们四个角色的细节来解决这个问题。
如果这不成功,请仔细检查您是否可以使用SSH密钥从构建服务器 SSH 到wordpress-server。
首先要做的事情; 让我们设置我们的服务器。为此,我们将编辑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-get update
)apt-get install
安装 Apache,MySQL,PHP和相关软件我们现在可以像这样运行我们的剧本:
ansible-playbook playbook.yml -i hosts -u sammy -K
你应该看到这样的输出:
Output
ansible-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
运行此之后,您应该能够访问在http://wordpress_server_ip/
里默认的Apache页面。真棒。Apache现已在wordpress-server上安装并运行。
如果您的构建在某个时刻无限期挂起TASK: [server | Update apt cache]
,则可能表示目标服务器缺少权限。确保在wordpress-server上正确配置了sudo访问权限。
让我们理清我们的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扩展。
我们还需要为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
此角色执行以下操作:
(自建服务器难免会遇到这样的问题,配置SSL很麻烦,虽然对一部分人来说这也是一种乐趣,但是如果您在生产环境使用,我还是建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。)
变量是从我们之前的文件中自动提取的,因此您不必在此处更改任何内容。
您可能对加密密码感兴趣。Ansible提供ansible-vault
了一个实用工具,但完整的讨论ansible-vault
超出了本教程的范围。
现在,我们一直在等待的那一刻...... 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用于存储Web内容的位置:
- name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
sudo: yes
提取文件后,让我们更新Apache的默认站点文档root以指向我们的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的默认站点以指向我们下载到/var/www/wordpress
的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
行,并用我们的playbook中的变量替换它们。
成功完成上述步骤后,我们的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
我们完成了!最后一次运行playbook来安装和配置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
文件中,并确保您的权限设置正确。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Automate Installing WordPress on Ubuntu 14.04 Using Ansible》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。