如何在Ubuntu18.04上使用Ansible通过LAMP安装和设置WordPress
介绍
由于现代应用程序环境的一次性性质,服务器自动化现在在系统管理中发挥着重要作用。 配置管理工具,例如Ansible,通常用于通过为新服务器建立标准程序来简化服务器设置自动化的过程,同时减少与手动设置相关的人为错误。
Ansible 提供了一个简单的架构,不需要在节点上安装特殊软件。 它还提供了一组强大的功能和内置模块,有助于编写自动化脚本。
本指南解释了如何使用 Ansible 自动执行我们关于 如何在 Ubuntu 18.04 上使用 LAMP 安装 WordPress 的指南中包含的步骤。 WordPress 是 Internet 上最流行的 CMS(内容管理系统),它允许用户在 MySQL 后端使用 PHP 处理建立灵活的博客和网站。 设置后,几乎所有管理都可以通过 Web 前端完成。
先决条件
为了执行我们在本指南中讨论的剧本提供的自动设置,您需要:
- 一个 Ansible 控制节点:安装了 Ansible 并配置为使用 SSH 密钥连接到 Ansible 主机的 Ubuntu 18.04 机器。 确保控制节点具有具有 sudo 权限的普通用户并启用了防火墙,如我们的 初始服务器设置 指南中所述。 要设置 Ansible,请按照我们关于 如何在 Ubuntu 18.04 上安装和配置 Ansible 的指南进行操作。
- 一个或多个 Ansible 主机:一个或多个远程 Ubuntu 18.04 服务器以前按照 如何使用 Ansible 在 Ubuntu 18.04 上自动进行初始服务器设置的指南设置。
在继续之前,您首先需要确保您的 Ansible 控制节点能够连接并在您的 Ansible 主机上执行命令。 如需连接测试,请查看 如何在 Ubuntu 18.04 上安装和配置 Ansible 的第 3 步。
这个剧本有什么作用?
此 Ansible 剧本提供了一种替代方法,可替代手动运行我们关于 如何在 Ubuntu 18.04 上使用 LAMP 安装 WordPress 的指南中概述的过程。
运行此 playbook 将在您的 Ansible 主机上执行以下操作:
- 安装
aptitude,这是 Ansible 首选的apt包管理器的替代方案。 - 安装所需的 LAMP 包和 PHP 扩展。
- 为 WordPress 网站创建并启用新的 Apache
VirtualHost。 - 启用 Apache 重写 (
mod_rewrite) 模块。 - 禁用默认的 Apache 网站。
- 设置 MySQL root 用户的密码。
- 删除匿名 MySQL 帐户和测试数据库。
- 为 WordPress 网站创建一个新的 MySQL 数据库和用户。
- 设置 UFW 以允许配置端口上的 HTTP 流量(默认为
80)。 - 下载并解压 WordPress。
- 设置正确的目录所有权和权限。
- 使用提供的模板设置
wp-config.php文件。
一旦 playbook 完成运行,您将根据您在配置变量中定义的选项在 LAMP 环境之上运行 WordPress 安装。
如何使用本手册
我们需要做的第一件事是从 do-community/ansible-playbooks 存储库中获取 WordPress on LAMP 剧本及其依赖项。 我们需要将此存储库克隆到 Ansible 控制节点内的本地文件夹。
如果您之前按照不同的指南克隆了此存储库,请访问您现有的 ansible-playbooks 副本并运行 git pull 命令以确保您已更新内容:
cd ~/ansible-playbooks git pull
如果这是您第一次使用 do-community/ansible-playbooks 存储库,您应该首先将存储库克隆到您的主文件夹:
cd ~ git clone https://github.com/do-community/ansible-playbooks.git cd ansible-playbooks
我们感兴趣的文件位于 wordpress-lamp_ubuntu1804 文件夹中,其结构如下:
wordpress-lamp_ubuntu1804 ├── files │ ├── apache.conf.j2 │ └── wp-config.php.j2 ├── vars │ └── default.yml ├── playbook.yml └── readme.md
以下是每个文件的内容:
files/apache.conf.j2:用于设置 Apache VirtualHost 的模板文件。files/wp-config.php.j2:用于设置 WordPress 配置文件的模板文件。vars/default.yml:用于自定义剧本设置的变量文件。playbook.yml:剧本文件,包含要在远程服务器上执行的任务。readme.md:包含有关此剧本的信息的文本文件。
我们将编辑 playbook 的变量文件以自定义其选项。 访问 wordpress-lamp_ubuntu1804 目录并使用您选择的命令行编辑器打开 vars/default.yml 文件:
cd wordpress-lamp_ubuntu1804 nano vars/default.yml
此文件包含一些需要您注意的变量:
变量/default.yml
--- #System Settings php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ] #MySQL Settings mysql_root_password: "mysql_root_password" mysql_db: "wordpress" mysql_user: "sammy" mysql_password: "password" #HTTP Settings http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80"
以下列表包含每个变量的简要说明以及您可能希望如何更改它们:
php_modules:一个包含 PHP 扩展的数组,应该安装这些扩展以支持您的 WordPress 设置。 您不需要更改此变量,但如果您的特定设置需要,您可能希望在列表中包含新的扩展。mysql_root_password:root MySQL 帐户所需的密码。mysql_db:应为 WordPress 创建的 MySQL 数据库的名称。mysql_user:应为 WordPress 创建的 MySQL 用户的名称。mysql_password:新 MySQL 用户的密码。http_host:您的域名。http_conf:将在 Apache 中创建的配置文件的名称。http_port:此虚拟主机的 HTTP 端口,其中80是默认值。
更新完 vars/default.yml 中的变量后,保存并关闭此文件。 如果您使用 nano,请按 CTRL + X、Y,然后按 ENTER。
您现在已准备好在一台或多台服务器上运行此 playbook。 默认情况下,大多数剧本都配置为在库存中的每台服务器上执行。 我们可以使用 -l 标志来确保只有一部分服务器或单个服务器受到剧本的影响。 我们还可以使用 -u 标志来指定我们使用远程服务器上的哪个用户来连接和执行远程主机上的 playbook 命令。
要仅在 server1 上执行 playbook,连接为 sammy,可以使用以下命令:
ansible-playbook playbook.yml -l server1 -u sammy
你会得到类似这样的输出:
OutputPLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [server1] TASK [Install prerequisites] *********************************************************************************************************** ok: [server1] … TASK [Download and unpack latest WordPress] ******************************************************************************************** changed: [server1] TASK [Set ownership] ******************************************************************************************************************* changed: [server1] TASK [Set permissions for directories] ************************************************************************************************* changed: [server1] TASK [Set permissions for files] ******************************************************************************************************* changed: [server1] TASK [Set up wp-config] **************************************************************************************************************** changed: [server1] RUNNING HANDLER [Reload Apache] ******************************************************************************************************** changed: [server1] RUNNING HANDLER [Restart Apache] ******************************************************************************************************* changed: [server1] PLAY RECAP ***************************************************************************************************************************** server1 : ok=22 changed=18 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
注意:有关如何运行 Ansible playbook 的更多信息,请查看我们的 Ansible 备忘单指南 。
当 playbook 完成运行后,您可以转到 Web 浏览器从那里完成 WordPress 的安装。
导航到您的服务器的域名或公共 IP 地址:
http://server_host_or_IP
你会看到这样的页面:
选择您希望用于 WordPress 安装的语言后,您将看到设置 WordPress 用户和密码的最后一步,以便您可以登录控制面板:
当您单击前进时,您将被带到一个提示您登录的页面:
登录后,您将被带到 WordPress 管理仪表板:
自定义 WordPress 安装的一些常见后续步骤包括为您的帖子选择永久链接设置(可在 Settings > Permalinks 中找到)和选择新主题(在 Appearance > Themes 中)。
剧本内容
您可以在 DigitalOcean Community Playbooks 存储库中的 wordpress-lamp_ubuntu1804 文件夹中找到本教程中介绍的 LAMP 服务器设置上的 WordPress。 要直接复制或下载脚本内容,请单击每个脚本顶部的 Raw 按钮。
为方便起见,此处还包含了剧本的全部内容及其相关文件。
变量/default.yml
default.yml 变量文件包含将在 playbook 任务中使用的值,例如要在 Apache 中配置的数据库设置和域名。
变量/default.yml
#System Settings php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ] #MySQL Settings mysql_root_password: "mysql_root_password" mysql_db: "wordpress" mysql_user: "sammy" mysql_password: "password" #HTTP Settings http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80"
文件/apache.conf.j2
apache.conf.j2 文件是一个 Jinja 2 模板文件,用于配置新的 Apache VirtualHost。 此模板中使用的变量在 vars/default.yml 变量文件中定义。
文件/apache.conf.j2
<VirtualHost *:{{ http_port }}>
ServerAdmin webmaster@localhost
ServerName {{ http_host }}
ServerAlias www.{{ http_host }}
DocumentRoot /var/www/{{ http_host }}
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/{{ http_host }}>
Options -Indexes
</Directory>
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
</VirtualHost>
文件/wp-config.php.j2
wp-config.php.j2 文件是另一个 Jinja 模板,用于设置 WordPress 使用的主要配置文件。 此模板中使用的变量在 vars/default.yml 变量文件中定义。 唯一的身份验证密钥和盐是使用散列函数生成的。
文件/info.php.j2
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the
* installation. You don't have to use the web site, you can
* copy this file to "wp-config.php" and fill in the values.
*
* This file contains the following configurations:
*
* * MySQL settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://codex.wordpress.org/Editing_wp-config.php
*
* @package WordPress
*/
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', '{{ mysql_db }}' );
/** MySQL database username */
define( 'DB_USER', '{{ mysql_user }}' );
/** MySQL database password */
define( 'DB_PASSWORD', '{{ mysql_password }}' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/** Filesystem access **/
define('FS_METHOD', 'direct');
/**#@+
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_KEY', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
/**#@-*/
/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = 'wp_';
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the Codex.
*
* @link https://codex.wordpress.org/Debugging_in_WordPress
*/
define( 'WP_DEBUG', false );
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}
/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );
剧本.yml
playbook.yml 文件是定义此设置中的所有任务的位置。 它首先定义应作为此设置目标的服务器组 (all),然后使用 become: true 定义应使用权限提升执行的任务 ([ X197X]) 默认情况下。 然后,它包含 vars/default.yml 变量文件以加载配置选项。
剧本.yml
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install prerequisites
apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
tags: [ system ]
- name: Install LAMP Packages
apt: name={{ item }} update_cache=yes state=latest
loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
tags: [ system ]
- name: Install PHP Extensions
apt: name={{ item }} update_cache=yes state=latest
loop: "{{ php_modules }}"
tags: [ system ]
# Apache Configuration
- name: Create document root
file:
path: "/var/www/{{ http_host }}"
state: directory
owner: "www-data"
group: "www-data"
mode: '0755'
tags: [ apache ]
- name: Set up Apache VirtualHost
template:
src: "files/apache.conf.j2"
dest: "/etc/apache2/sites-available/{{ http_conf }}"
notify: Reload Apache
tags: [ apache ]
- name: Enable rewrite module
shell: /usr/sbin/a2enmod rewrite
notify: Reload Apache
tags: [ apache ]
- name: Enable new site
shell: /usr/sbin/a2ensite {{ http_conf }}
notify: Reload Apache
tags: [ apache ]
- name: Disable default Apache site
shell: /usr/sbin/a2dissite 000-default.conf
notify: Restart Apache
tags: [ apache ]
# MySQL Configuration
- name: Set the root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
tags: [ mysql, mysql-root ]
- name: Remove all anonymous user accounts
mysql_user:
name: ''
host_all: yes
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
tags: [ mysql ]
- name: Remove the MySQL test database
mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
tags: [ mysql ]
- name: Creates database for WordPress
mysql_db:
name: "{{ mysql_db }}"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
tags: [ mysql ]
- name: Create MySQL user for WordPress
mysql_user:
name: "{{ mysql_user }}"
password: "{{ mysql_password }}"
priv: "{{ mysql_db }}.*:ALL"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
tags: [ mysql ]
# UFW Configuration
- name: "UFW - Allow HTTP on port {{ http_port }}"
ufw:
rule: allow
port: "{{ http_port }}"
proto: tcp
tags: [ system ]
# WordPress Configuration
- name: Download and unpack latest WordPress
unarchive:
src: https://wordpress.org/latest.tar.gz
dest: "/var/www/{{ http_host }}"
remote_src: yes
creates: "/var/www/{{ http_host }}/wordpress"
tags: [ wordpress ]
- name: Set ownership
file:
path: "/var/www/{{ http_host }}"
state: directory
recurse: yes
owner: www-data
group: www-data
tags: [ wordpress ]
- name: Set permissions for directories
shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \\;"
tags: [ wordpress ]
- name: Set permissions for files
shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \\;"
tags: [ wordpress ]
- name: Set up wp-config
template:
src: "files/wp-config.php.j2"
dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"
tags: [ wordpress ]
handlers:
- name: Reload Apache
service:
name: apache2
state: reloaded
- name: Restart Apache
service:
name: apache2
state: restarted
随意修改这些文件以最适合您自己工作流程中的个人需求。
结论
在本指南中,我们使用 Ansible 在 Ubuntu 18.04 服务器上使用 LAMP 自动安装和设置 WordPress 网站的过程。
如果您想在此 playbook 中包含其他任务以进一步自定义您的服务器设置,请参阅我们的 Ansible 入门指南 配置管理 101:编写 Ansible Playbooks。