如何在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 目录中。
  • 通过将其模式设置为 775a+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 - 其值为 plugintheme
  • $action - 这将是子命令之一。
  • $resource_name - 插件或主题的名称。
  • $root_directory - 这是必要且重要的,因为必须从安装 WordPress 的目录中运行 wp-cli 命令。
  • $user - 此参数的值应该是拥有 WordPress 实例的 Unix 用户的用户名。

这是我们在这种类型中所做的:

  • 确保已安装 WP-CLI
  • 根据收到的参数创建并执行 WP-CLI 命令

为了避免错误,使用 Puppet 的 exec 命令的 unlessonlyif 属性添加以下限制:

  • 仅在尚未安装项目时才安装它。 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。 要在名为 host1host2 的两台主机上更新 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,可以参考本教程