如何在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,可以参考本教程。