如何使用Ansible自动在Ubuntu 14.04上安装WordPress

介绍

Ansible是一种简单,无代理的自动化基础架构方式。如果您发现自己一遍又一遍地部署WordPress,Ansible可以为您节省大量时间。

使用几行YAML(一种直接的标记语言),我们将自动完成在新的Ubuntu 14.04服务器上设置WordPress的繁琐过程。我们将根据本教程中概述的过程或多或少地安装WordPress ,但会自动安装。

我们将使用两个服务器:一个运行Ansible的构建服务器,以及一个使用Ansible安装WordPress的目标服务器。

先决条件

要完成本教程,您需要进行以下设置:

  • 运行Ubuntu 14.04的构建服务器。我们将在此服务器上安装Ansible(在本教程中称为构建服务器)。我们将登录此服务器,本教程的所有文件和命令都将在此服务器上运行
  • 运行Ubuntu 14.04的目标服务器。我们将在此服务器上安装WordPress(通过Ansible)(在本教程中称为wordpress-server
  • 为两个服务器配置的有Sudo权限非root]用户(你可能需要一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。)
  • 构建服务器 sudo用户的SSH密钥添加到wordpress-server的sudo用户的authorized_keys中。

(可选)无密码sudo访问

这是更快,但安全性较差使用您的密码的上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

第1步 - 安装Ansible

在本节中,我们将在您的构建服务器上安装Ansible 。

SSH到您的构建服务器并运行此命令以安装Ansible:

sudo apt-get install ansible -y 

您可以通过运行来确保安装Ansible:

ansible --version

您应该看到输出类似于:

Output
ansible 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),创建一个名为rolescd的目录:

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步 - 编写Playbook

在本节中,我们将编写用于在远程服务器上安装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

第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-cache(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角色中执行此操作。编辑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用户
  • 授予该用户访问我们数据库的权限

(自建服务器难免会遇到这样的问题,配置SSL很麻烦,虽然对一部分人来说这也是一种乐趣,但是如果您在生产环境使用,我还是建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。)

变量是从我们之前的文件中自动提取的,因此您不必在此处更改任何内容。

您可能对加密密码感兴趣。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/wwwApache用于存储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

这将更新DocumentRootApache的默认站点以指向我们下载到/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_NAMEDB_USERDB_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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在CentOS 7上使用InfluxDB分析系统指标

InfluxDB是一个时间序列,指标和分析数据库。时间序列数据库旨在解决存储在一段时间内进行的连续测量所产生的数据的问题。此数据可能包含系统指标(如CPU和内存...

1781
来自专栏张善友的专栏

使用密码记录工具keepass来保存密码

在第一章,曾经给过您建议,密码不要保存在文档中,那样不安全,如果密码很多而且又很复杂,人的大脑是不可能很容易记住的,只能记录下来,如果不能记在文档中那记在哪里呢...

4319
来自专栏DevOps时代的专栏

占坑!利用 JenKins 持续集成 iOS 项目时遇到的问题

持续集成(Continuous Integration,简称CI)是一种软件开发实践:许多团队频繁地集成他们的工作,每位成员通常进行日常集成,进而每天会有多种集...

1822
来自专栏云计算教程系列

CentOS 7如何设置uWSGI和Nginx提供Python应用服务

在本指南中,我们将设置一个由uWSGI提供服务的简单WSGI应用程序。我们将使用Nginx Web服务器作为应用程序服务器的反向代理,以提供强大的连接处理。我们...

2164
来自专栏CSDN技术头条

由浅入深学习JavaScript Debug技巧

我常常看到不少开发者不懂如何Debug JavaScript代码,因此决定写一篇博客为初学者介绍如何Debug。我希望这篇文章可以提供一些有用的信息。我尝试在本...

1909
来自专栏王小雷

React-Native-Android-Studio整合开发+环境配置+官方实例

linux下React Native开发环境搭建,使用Android-studio工具进行React Native整合开发。 参考React Native的...

5269
来自专栏抠抠空间

Linux上安装pip以及setuptools

2700
来自专栏yukong的小专栏

【ssm个人博客项目实战03】左侧导航菜单功能实现

由于每一个菜单选项单击一下都会打开一个tab 所以我们可以把这个抽出来作为一个方法

1655
来自专栏一个会写诗的程序员的博客

webpack 极简教程(前端自动化构建)

Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

1071
来自专栏搞前端的李蚊子

Vue.js实现一个SPA登录页面的过程

技术栈 vue.js 主框架 vuex 状态管理 vue-router 路由管理 一般过程 在一般的登录过程中,一种前端方案是: 检查状态:进入页面时或者路...

1.1K12

扫码关注云+社区

领取腾讯云代金券