前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用Ansible自动在Ubuntu 14.04上安装WordPress

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

原创
作者头像
葡萄
修改2018-09-20 14:58:54
1.5K0
修改2018-09-20 14:58:54
举报

介绍

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文件:

代码语言:javascript
复制
visudo

最后添加这一行:

代码语言:javascript
复制
sammy ALL=(ALL) NOPASSWD: ALL

这必须是文件中的最后一行。重要的是,这是最后一行,否则将被覆盖。

注意:始终使用visudo命令编辑sudoers文件。这将在保存文件之前验证您的更改 - 这可以避免您意外地将自己完全锁定在机器之外。

完成此操作后,您应该能够在wordpress-server上执行以下命令而无需提供密码:

代码语言:javascript
复制
sudo echo "Hello"

现在,在本教程中,您可以运行ansible-playbook不带-K标志的命令,因此您无需手动输入sudo密码。

代码语言:javascript
复制
ansible-playbook playbook.yml -i hosts -u sammy

第1步 - 安装Ansible

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

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

代码语言:javascript
复制
sudo apt-get install ansible -y 

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

代码语言:javascript
复制
ansible --version

您应该看到输出类似于:

代码语言:javascript
复制
Output
ansible 1.5.4

第2步 - 设置文件结构

现在我们已经安装了Ansible,让我们为Ansible playbook准备文件结构。

为我们的剧本创建一个目录。

代码语言:javascript
复制
cd ~
mkdir wordpress-ansible && cd wordpress-ansible

cd进入这个目录并创建两个文件:一个调用playbook.yml(这是我们将编写安装WordPress的命令)和另一个调用hosts(这告诉Ansible在哪些服务器上运行命令):

代码语言:javascript
复制
touch playbook.yml
touch hosts

最佳做法是将我们的剧本分成角色。您可以将角色视为可重用模块。对于这个项目,我们将创建四个角色:

  • 服务器
  • PHP
  • MySQL
  • WordPress

在项目的根文件夹(~/wordpress-ansible),创建一个名为rolescd的目录:

代码语言:javascript
复制
mkdir roles && cd roles

我们可以使用名为的Ansible工具来引导我们的角色ansible-galaxy。对于我们要创建的每个角色,我们将运行ansible-galaxy init

代码语言:javascript
复制
ansible-galaxy init server 
ansible-galaxy init php 
ansible-galaxy init mysql
ansible-galaxy init wordpress

您会注意到,这会为我们的每个角色创建一个完整的文件结构。这符合Ansible的最佳实践。在大多数情况下,我们将关注每个角色的tasks/main.yml文件。

此时我们应该有以下文件结构:

代码语言:javascript
复制
[.]
|_ playbook.yml
|_ hosts
|_ [roles]
      |_ [server]
            |_ ...
      |_ [php]
            |_ ...
      |_ [mysql]
            |_ ...
      |_ [wordpress]
            |_ ...                                    

第3步 - 编写Playbook

在本节中,我们将编写用于在远程服务器上安装WordPress的命令。

库存(主机文件)

Ansible清单通知Ansible我们要安装WordPress的服务器。我们可以为我们的库存文件(hosts)中定义的服务器或服务器组运行我们的playbooks 。我们的库存非常简单。

编辑hosts

代码语言:javascript
复制
nano ~/wordpress-ansible/hosts

添加[wordpress]和它下方的wordpress-server的IP地址:

代码语言:javascript
复制
[wordpress]
wordpress_server_ip

您可以在该[wordpress]组下放置许多不同的IP 。如果您在所有服务器上设置了访问权限,这将导致命令在此处列出的所有服务器上运行。这将允许您一次在多个不同的服务器上安装WordPress。

剧本

我们可以将剧本视为WordPress应用程序的定义。我们的剧本将结合我们创建的角色来配置有用的应用程序(在本例中为WordPress站点)。

编辑剧本文件:

代码语言:javascript
复制
nano ~/wordpress-ansible/playbook.yml

添加这些内容,这告诉Ansible哪些主机上运行角色(在wordpress那些中hosts哪些角色要运行文件),和运行哪些角色:

代码语言:javascript
复制
- hosts: wordpress
​
  roles:
    - server
    - php
    - mysql
    - wordpress

移动到您的playbook目录:

代码语言:javascript
复制
cd ~/wordpress-ansible/

让我们通过运行playbook 确保从构建服务器wordpress-server的基本连接。它还没有做任何事情; 它只是测试连接:

代码语言:javascript
复制
ansible-playbook playbook.yml -i hosts -u sammy -K

出现提示时,在wordpress-server上输入sudo用户的sudo密码。

您应该看到输出类似于:

代码语言:javascript
复制
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角色。

服务器角色将在目标服务器上安装我们需要的所有软件。编辑此文件:

代码语言:javascript
复制
nano roles/server/tasks/main.yml`

添加以下内容; 确保只有一行---(默认情况下应该有一行):

代码语言:javascript
复制
---
- 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和相关软件

我们现在可以像这样运行我们的剧本:

代码语言:javascript
复制
ansible-playbook playbook.yml -i hosts -u sammy -K

你应该看到这样的输出:

代码语言:javascript
复制
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的主要任务文件:

代码语言:javascript
复制
nano roles/php/tasks/main.yml

添加以下内容(同样,---行应该已经存在):

代码语言:javascript
复制
---
- 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文件中的任何变量指定默认值。

代码语言:javascript
复制
nano roles/mysql/defaults/main.yml

按顺序添加数据库名称,数据库用户名和数据库密码(您要创建的)。确保选择安全的wp_db_password

代码语言:javascript
复制
---
wp_mysql_db: wordpress
wp_mysql_user: wordpress
wp_mysql_password: wp_db_password

添加任务以创建我们的数据库和用户来访问它。

代码语言:javascript
复制
nano roles/mysql/tasks/main.yml

添加以下内容:

代码语言:javascript
复制
---
- 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文件中添加了一些不同的任务,因此请保持此部分的开放性。

代码语言:javascript
复制
nano roles/wordpress/tasks/main.yml

首先,我们需要将WordPress下载到/tmp目录中(您之间的安全意识会注意到我们已禁用证书验证,这会中断下载):

代码语言:javascript
复制
---
- 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内容的位置:

代码语言:javascript
复制
- name: Extract WordPress  unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no 
  sudo: yes

提取文件后,让我们更新Apache的默认站点文档root以指向我们的WordPress站点:

代码语言:javascript
复制
- 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进行编辑:

代码语言:javascript
复制
nano roles/wordpress/handlers/main.yml

添加以下内容:

代码语言:javascript
复制
---
- name: restart apache
  service: name=apache2 state=restarted
  sudo: yes      

当指定的任务notify: restart apache发生更改时,将调用此处理程序,从而导致服务器重新启动Apache。

配置WordPress

回到roles/wordpress/tasks/main.yml

最后,我们需要为WordPress网站做一些配置:

首先,我们复制示例配置文件:

代码语言:javascript
复制
- 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

更新此文件中的一些常量以匹配我们的数据库信息:

代码语言:javascript
复制
- 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的完整任务文件:

代码语言:javascript
复制
---
- 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的文件(您应该已经创建):

代码语言:javascript
复制
---
- name: restart apache
  service: name=apache2 state=restarted
  sudo: yes

我们完成了!最后一次运行playbook来安装和配置WordPress:

代码语言:javascript
复制
ansible-playbook playbook.yml -i hosts -u sammy -K

您应该能够在线查看您的WordPress网站:http://your_server_ip

您可以从此处完成手动WordPress站点设置。

结论

恭喜!您现在可以使用单个命令在任何Ubuntu 14.04服务器上安装WordPress站点:

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先决条件
    • (可选)无密码sudo访问
    • 第1步 - 安装Ansible
    • 第2步 - 设置文件结构
    • 第3步 - 编写Playbook
      • 库存(主机文件)
        • 剧本
        • 第3步 - 创建角色
          • 服务器
            • PHP
              • MySQL
                • WordPress
                • 结论
                相关产品与服务
                网站建设
                网站建设(Website Design Service,WDS),是帮助您快速搭建企业网站的服务。通过自助模板建站工具及专业设计服务,无需了解代码技术,即可自由拖拽模块,可视化完成网站管理。全功能管理后台操作方便,一次更新,数据多端同步,省时省心。使用网站建设服务,您无需维持技术和设计师团队,即可快速实现网站上线,达到企业数字化转型的目的。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档