如何在Ubuntu14.04上使用Puppet管理WordPress主题和插件
介绍
如果您是管理多个 WordPress 实例的网站管理员,您将知道保持所有主题和插件更新是一项重复性工作。 此外,每隔一天就会出现这么多新的有趣的主题和插件,你一定会发现自己安装和卸载了很多。
在本教程中,您将学习如何使用简单的 Puppet 清单和 WP-CLI 来自动化安装、删除和更新 WordPress 主题和插件等活动。
先决条件
您将需要以下内容:
- 一个 Ubuntu 14.04 Droplet
- 一个 sudo 用户
- 基本了解 Puppet 模块和清单如何工作。 您可以参考本教程来复习您的 Puppet 技能:如何使用 Puppet 管理您的服务器
- WordPress 4.1 或更新版本
- Puppet 3.7.1 或更新版本
使用本教程设置 WordPress 和 Puppet:如何创建 Puppet 模块以在 Ubuntu 14.04 上自动安装 WordPress
第 1 步 — 创建一个新模块
在这一步中,我们将基于我们在 第一个教程 中创建的原版 WordPress 安装进行构建。
我们的模块将使用 WP-CLI(WordPress 命令行界面)来执行其大部分操作。 顾名思义,WP-CLI 是一个允许我们使用命令行(和脚本)而不是浏览器与 WordPress 交互的工具。
现在,创建一个允许我们使用 Puppet 与 WP-CLI 交互的模块。
进入 Puppet 模块目录。
cd /etc/puppet/modules
我们称模块为 wordpress_manager。 为它创建一个新目录。
sudo mkdir /etc/puppet/modules/wordpress_manager
创建一个名为 manifests 的目录来存储其所有清单。
sudo mkdir /etc/puppet/modules/wordpress_manager/manifests
第 2 步 — 创建一个类来安装 WP-CLI
在这一步中,我们将自动安装 WP-CLI。 WP-CLI 的安装必须自动化,因为它必须存在于每台运行 WordPress 的服务器上。
这是我们在这堂课中所做的:
- 确保已安装
curl。 这是下载最新版本的 WP-CLI 所必需的。 - 确保已安装
php5-cli。 - 使用
curl下载 WP-CLI 并将其放置在/usr/bin目录中。 - 通过将其模式设置为
775或a+x使 WP-CLI 可执行。
使用 nano 创建一个名为 install.pp 的新文件。
sudo nano /etc/puppet/modules/wordpress_manager/manifests/install.pp
将以下代码添加到其中。 内嵌注释应该可以帮助您理解代码的作用:
class wordpress_manager::install {
# Install curl
package { 'curl':
ensure => latest
}
# Install php5-cli
package { 'php5-cli':
ensure => latest
}
# Download WP-CLI using curl
exec { 'Install WP CLI':
command => "/usr/bin/curl -o /usr/bin/wp-cli -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar",
require => [ Package['curl'], Package['php5-cli'] ],
creates => "/usr/bin/wp-cli"
}
# Change the mode of WP-CLI to a+x
file { '/usr/bin/wp-cli':
mode => "775",
require => Exec['Install WP CLI']
}
}
exec 命令中的 creates 属性用于检查 WP-CLI 是否已经下载。 如果没有这个属性,Puppet 会在每次使用模块时下载 WP-CLI。
第 3 步 — 创建一个已定义的类型以与 WP-CLI 交互
要管理主题,应使用 WP-CLI 的 theme 命令。 在我们的清单中,我们使用带有 theme 命令的激活、删除、安装和更新子命令。 同样,要管理插件,应使用 WP-CLI 的 plugin 命令。 我们使用带有 plugin 命令的激活、停用、安装、卸载和更新子命令。
因此,我们定义的类型需要以下参数:
$resource_type- 其值为plugin或theme。$action- 这将是子命令之一。$resource_name- 插件或主题的名称。$root_directory- 这是必要且重要的,因为必须从安装 WordPress 的目录中运行wp-cli命令。$user- 此参数的值应该是拥有 WordPress 实例的 Unix 用户的用户名。
这是我们在这种类型中所做的:
- 确保已安装 WP-CLI
- 根据收到的参数创建并执行 WP-CLI 命令
为了避免错误,使用 Puppet 的 exec 命令的 unless 和 onlyif 属性添加以下限制:
- 仅在尚未安装项目时才安装它。 WP-CLI 的
is-installed命令用于判断该项目是否已安装。 - 仅当已安装项目时才激活/停用/删除/卸载/更新项目。
创建一个名为 resource.pp 的新文件。
sudo nano /etc/puppet/modules/wordpress_manager/manifests/resource.pp
将以下代码添加到其中。 同样,内嵌注释应该可以帮助您理解代码的作用。
注意:默认情况下,我们的模块会使用/var/www作为Wordpress的安装目录,root作为Wordpress文件的所有者。 您可能需要更改代码顶部的 $root_directory 和 $user 属性的值以反映您的环境。
define wordpress_manager::resource (
$resource_name,
$resource_type,
$root_directory = "/var/www/",
$action,
$user = "root",
) {
# Make sure WP_CLI is installed
require wordpress_manager::install
$wp_cli = "/usr/bin/wp-cli --allow-root"
# Install the theme or plugin unless it is already installed.
if $action == "install" {
exec { "Install $resource_name":
command => "$wp_cli $resource_type $action $resource_name",
unless => "$wp_cli $resource_type is-installed $resource_name",
cwd => $root_directory,
user => $user
}
}
# Activate or update the theme or plugin only if it is currently installed.
if $action == "activate" or $action == "update" {
exec { "$action $resource_name":
command => "$wp_cli $resource_type $action $resource_name",
onlyif => "$wp_cli $resource_type is-installed $resource_name",
cwd => $root_directory,
user => $user
}
}
# Uninstall or deactivate a plugin only if it is currently installed.
if $resource_type == "plugin" {
if $action == "uninstall" or $action == "deactivate" {
exec { "$action $resource_name":
command => "$wp_cli plugin $action $resource_name",
onlyif => "$wp_cli plugin is-installed $resource_name",
cwd => $root_directory,
user => $user
}
}
}
# Delete a theme only if it is currently installed.
if $action == "delete" and $resource_type == "theme" {
exec { "$action $resource_name":
command => "$wp_cli theme $action $resource_name",
onlyif => "$wp_cli theme is-installed $resource_name",
cwd => $root_directory,
user => $user
}
}
}
我们对该模块中的所有 WP-CLI 命令使用 --allow-root 标志。 它是处理 root 拥有的 WordPress 实例所必需的。 如果没有此标志,尝试以 root 身份运行 WP-CLI 将失败并显示错误消息:
Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress install exists under.
我们的 Puppet 模块现已准备就绪。 以下是一些示例,可帮助您了解如何使用它。
示例 1 — 应用新的 WordPress 主题
让我们使用我们的 Puppet 模块将新的 WordPress 主题应用于 WordPress 实例。
默认情况下,WordPress 使用 twentyfifteen 主题。 这是它的样子:
让我们安装并应用一个名为 expound 的新主题。 要查找更多主题,您可以浏览WordPress的主题目录。
使用 nano(或您选择的编辑器)创建一个名为 manage_expound_theme.pp 的新文件。
nano /tmp/manage_expound_theme.pp
向其中添加以下代码:
wordpress_manager::resource { 'install expound':
resource_name => "expound",
resource_type => "theme",
action => "install"
}
wordpress_manager::resource { 'activate expound':
resource_name => "expound",
resource_type => "theme",
action => "activate",
require => WordPress_manager::Resource['install expound']
}
使用 puppet apply 命令运行清单。
sudo puppet apply /tmp/manage_expound_theme.pp
完成运行后,输出应如下所示:
Notice: Compiled catalog for zona-virtualbox in environment production in 0.81 seconds Notice: /Stage[main]/Main/WordPress_manager::Resource[install expound]/Exec[Install expound]/returns: executed successfully Notice: /Stage[main]/Main/WordPress_manager::Resource[activate expound]/Exec[activate expound]/returns: executed successfully Notice: Finished catalog run in 13.72 seconds
访问您的 WordPress 站点 http://your_server_ip/ 以查看新主题的实际效果:
示例 2 — 删除主题
如果你想删除一个主题,你应该先激活另一个主题。 例如,如果你想回到twentyfifteen主题,再次打开manage_expound_theme.pp:
nano /tmp/manage_expound_theme.pp
删除文件中的所有内容,并使用以下命令覆盖它:
wordpress_manager::resource { 'activate twentyfifteen':
resource_name => "twentyfifteen",
resource_type => "theme",
action => "activate"
}
wordpress_manager::resource { 'delete expound':
resource_name => "expound",
resource_type => "theme",
action => "delete",
require => WordPress_manager::Resource['activate twentyfifteen']
}
再次应用清单。
sudo puppet apply /tmp/manage_expound_theme.pp
您现在可以在 http://your_server_ip/ 访问您的 WordPress 站点,以查看应用的 twentyfifteen 主题。
示例 3 - 激活插件
Akismet 插件默认安装,但没有激活,所以现在让我们使用我们的 Puppet 模块来激活 akismet 插件。
创建一个名为 manage_akismet.pp 的新清单。
nano /tmp/manage_akismet.pp
向其中添加以下代码:
wordpress_manager::resource { 'activate akismet':
resource_name => "akismet",
resource_type => "plugin",
action => "activate"
}
应用清单。
sudo puppet apply /tmp/manage_akismet.pp
您可以通过 plugin list 命令检查 Akismet 是否已激活。 默认情况下,我们的模块将使用 /var/www 作为 WordPress 安装目录,但如果这与您的环境不同,您可以适当修改 --path 标志。
wp-cli --allow-root --path=/var/www/ plugin list
您应该看到类似于以下内容的输出:
+---------+----------+--------+---------+ | name | status | update | version | +---------+----------+--------+---------+ | akismet | active | none | 3.0.4 | | hello | inactive | none | 1.6 | +---------+----------+--------+---------+
示例 4 — 卸载插件
在卸载插件之前,您应该确保它未处于活动状态。 以下是卸载 akismet 的方法。 打开 manage_akismet.pp。
nano /tmp/manage_akismet.pp
删除文件中的所有内容,并使用以下命令覆盖它:
wordpress_manager::resource { 'deactivate akismet':
resource_name => "akismet",
resource_type => "plugin",
action => "deactivate"
}
wordpress_manager::resource { 'uninstall akismet':
resource_name => "akismet",
resource_type => "plugin",
action => "uninstall",
require => WordPress_manager::Resource['deactivate akismet']
}
重新运行清单。
sudo puppet apply /tmp/manage_akismet.pp
现在,重新运行 plugin list 命令。
wp-cli --allow-root --path=/var/www/ plugin list
您将看到 Akismet 不再列出。
+---------+----------+--------+---------+ | name | status | update | version | +---------+----------+--------+---------+ | hello | inactive | none | 1.6 | +---------+----------+--------+---------+
结论
您现在知道如何使用简单的 Puppet 模块来管理 WordPress 实例的插件和主题。 您已经看到了如何使用该模块执行各种任务的示例。 为了简单起见,本教程中的所有示例都使用了 Puppet 的独立模式。
作为您可以使用 Puppet 执行的其他操作的示例,您可以使用 Puppet 的 Agent-Master 模式在多个主机上执行相同的操作。 您所要做的就是在这些主机的节点定义中使用类型 wordpress_manager::resource。 要在名为 host1 和 host2 的两台主机上更新 Akismet 插件,您的 Puppet Master 的 site.pp 应包含:
node 'host1', 'host2' {
wordpress_manager::resource { 'update akismet':
resource_name => "akismet",
resource_type => "plugin",
action => "update"
}
}
WP-CLI 非常强大,提供了很多命令。 随意扩展我们在本教程中创建的模块以添加更多 WP-CLI 命令。 如果您想了解更多信息,本教程中有关于Puppet 的附加信息; 想了解更多关于WP-CLI,可以参考本教程。