如何创建Puppet模块以在Ubuntu14.04上自动安装WordPress

来自菜鸟教程
跳转至:导航、​搜索

介绍

Puppet 是一种配置管理工具,系统管理员使用它来自动化维护公司 IT 基础架构所涉及的流程。 编写单独的 Puppet 清单文件足以自动执行简单的任务。 但是,当您要自动化整个工作流程时,最好创建和使用 Puppet 模块。 Puppet 模块只是清单以及这些清单所需的文件的集合,整齐地捆绑到可重用和可共享的包中。

WordPress 是一个非常流行的博客平台。 作为管理员,您可能会发现自己经常安装 WordPress 及其依赖项(Apache、PHP 和 MySQL)。 这个安装过程非常适合自动化,今天我们创建了一个 Puppet 模块来实现这一点。

本教程包括的内容

在本教程中,您将创建一个可以执行以下活动的 Puppet 模块:

  • 安装 Apache 和 PHP
  • 安装 MySQL
  • 在 MySQL for WordPress 上创建数据库和数据库用户
  • 安装和配置 WordPress

然后,您将创建一个简单的清单,使用该模块在 Ubuntu 14.04 上设置 WordPress。 在本教程结束时,您将在服务器上拥有一个可重用的 WordPress 模块和一个正常工作的 WordPress 安装。

先决条件

您将需要以下内容:

  • Ubuntu 14.04 服务器
  • 一个 sudo 用户
  • 进入控制面板设置后,您应该了解如何管理 WordPress。 如果您需要帮助,请查看 本教程 的后面部分

第 1 步 — 在独立模式下安装 Puppet

要使用 apt-get 安装 Puppet,必须将 Puppet Labs Package 存储库添加到可用存储库列表中。 Puppet Labs 有一个 Debian 软件包可以做到这一点。 此软件包的名称取决于您使用的 Ubuntu 版本。 由于本教程使用 Ubuntu 14.04,Trusty Tahr,您必须下载并安装 puppetlabs-release-trusty.deb

创建并移动到您的 Downloads 目录:

mkdir ~/Downloads
cd ~/Downloads

获取包裹:

wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
sudo dpkg -i puppetlabs-release-trusty.deb

您现在可以使用 apt-get 安装 Puppet。

sudo apt-get update
sudo apt-get install puppet

现在已安装木偶。 您可以通过输入以下内容进行检查:

sudo puppet --version

它应该打印 Puppet 的版本。 在撰写本文时,最新版本是 3.7.1

注意:如果看到关于templatedir的警告信息,请检查步骤2中的解决方案。

第 2 步 - 安装 Apache 和 MySQL 模块

管理 Apache 和 MySQL 是如此常见的活动,以至于 PuppetLabs 为它们提供了自己的模块。 我们将使用这些模块来安装和配置 Apache 和 MySQL。

您可以使用以下命令列出系统上安装的所有 Puppet 模块:

sudo puppet module list

您会发现当前没有安装任何模块。

您可能会看到一条警告消息:

Warning: Setting templatedir is deprecated. See http://links.puppetlabs.com/env-settings-deprecations
(at /usr/lib/ruby/vendor_ruby/puppet/settings.rb:1071:in `each')

要删除此警告,请使用 nano 编辑 puppet.conf 文件,并注释掉 templatedir 行:

sudo nano /etc/puppet/puppet.conf

编辑后,文件应具有以下内容。 您只是注释掉 templatedir 行:

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
#templatedir=$confdir/templates

[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY

那应该删除警告消息。

安装 PuppetLabs Apache 和 MySQL 模块:

sudo puppet module install puppetlabs-apache
sudo puppet module install puppetlabs-mysql

通过再次列出模块来验证安装:

sudo puppet module list

您应该能够在列表中看到 Apache 和 MySQL 模块。

/etc/puppet/modules
├── puppetlabs-apache (v1.1.1)
├── puppetlabs-concat (v1.1.1)
├── puppetlabs-mysql (v2.3.1)
└── puppetlabs-stdlib (v4.3.2)

第 3 步 - 为 WordPress 创建一个新模块

创建一个新目录以保留所有自定义模块。

mkdir ~/MyModules
cd ~/MyModules

让我们称我们的模块为 do-wordpress。 生成通用的新模块:

puppet module generate do-wordpress --skip-interview

如果您不包含 –skip-interview 标志,该命令将是交互式的,并会提示您有关填充 metadata.json 文件的模块的各种问题。

此时,一个名为 do-wordpress 的新目录已创建。 它包含样板代码和构建模块所需的目录结构。

编辑 metadata.json 文件,将 puppetlabs-stdlib 替换为 puppetlabs/stdlib

nano ~/MyModules/do-wordpress/metadata.json

由于 Puppet 中当前存在一个打开的 错误 ,因此需要进行此编辑。 更改后,您的 metadata.json 文件应如下所示:

{
  "name": "do-wordpress",
  "version": "0.1.0",
  "author": "do",
  "summary": null,
  "license": "Apache 2.0",
  "source": "",
  "project_page": null,
  "issues_url": null,
  "dependencies": [
    {"name":"puppetlabs/stdlib","version_requirement":">= 1.0.0"}
  ]
}

第 4 步 - 创建清单以安装 Apache 和 PHP

使用 nanomanifests 目录中创建和编辑名为 web.pp 的文件,该文件将安装 Apache 和 PHP:

nano ~/MyModules/do-wordpress/manifests/web.pp

使用默认参数安装 Apache 和 PHP。 我们使用 prefork 作为 MPM(多处理模块)来最大化与其他库的兼容性。

将以下代码准确地添加到文件中:

class wordpress::web {
    
    # Install Apache
    class {'apache': 
        mpm_module => 'prefork'
    }

    # Add support for PHP 
    class {'::apache::mod::php': }
}

第 5 步 - 创建一个文件来存储配置变量

使用 nanomanifests 目录下创建和编辑一个名为 conf.pp 的文件。

nano ~/MyModules/do-wordpress/manifests/conf.pp

此文件是您应该设置自定义配置值(例如密码和名称)的地方。 系统上的每个其他配置文件都将从该文件中提取其值。

将来,如果您需要更改 Wordpress/MySQL 配置,您只需更改此文件即可。

将以下代码添加到文件中。 确保将数据库值替换为要用于 WordPress 的自定义信息。 您很可能希望将 db_host 设置为 localhost。 您 应该 更改 root_passworddb_user_password

您可以或应该编辑的变量标记为 red

class wordpress::conf {
    # You can change the values of these variables
    # according to your preferences
    
    $root_password = 'password'
    $db_name = 'wordpress'
    $db_user = 'wp'
    $db_user_password = 'password'
    $db_host = 'localhost'

    # Don't change the following variables

    # This will evaluate to wp@localhost
    $db_user_host = "${db_user}@${db_host}"

    # This will evaluate to wp@localhost/wordpress.*
    $db_user_host_db = "${db_user}@${db_host}/${db_name}.*"
}

第 6 步 - 为 MySQL 创建清单

使用 nanomanifests 目录下创建并编辑一个名为 db.pp 的文件:

nano ~/MyModules/do-wordpress/manifests/db.pp

此清单执行以下操作:

  • 安装 MySQL 服务器
  • 设置 MySQL 服务器的 root 密码
  • 为 Wordpress 创建数据库
  • 为 Wordpress 创建用户
  • 授予用户访问数据库的权限
  • 为各种语言安装 MySQL 客户端和绑定

所有上述动作都由类 ::mysql::server::mysql::client 执行。

完全按照所示将以下代码添加到文件中。 包含内联注释以提供更好的理解:

class wordpress::db {
        
    class { '::mysql::server':

        # Set the root password
        root_password => $wordpress::conf::root_password,

        # Create the database
        databases => {
            "${wordpress::conf::db_name}" => {
                ensure => 'present',
                charset => 'utf8'
            }
        },

        # Create the user
        users => {
            "${wordpress::conf::db_user_host}" => {
                ensure => present,
                password_hash => mysql_password("${wordpress::conf::db_user_password}")
            }
        },

        # Grant privileges to the user
        grants => {
            "${wordpress::conf::db_user_host_db}" => {
                ensure     => 'present',
                options    => ['GRANT'],
                privileges => ['ALL'],
                table      => "${wordpress::conf::db_name}.*",
                user       => "${wordpress::conf::db_user_host}",
            }
        },
    }

    # Install MySQL client and all bindings
    class { '::mysql::client':
        require => Class['::mysql::server'],
        bindings_enable => true
    }
}

第 7 步 - 下载最新的 WordPress

使用wget官网下载最新的WordPress安装包,并存放在files目录下。

创建并移动到新目录:

mkdir ~/MyModules/do-wordpress/files
cd ~/MyModules/do-wordpress/files

下载文件:

wget http://wordpress.org/latest.tar.gz

第 8 步 - 为 wp-config.php 创建模板

您可能已经知道 Wordpress 需要一个 wp-config.php 文件,其中包含有关允许使用的 MySQL 数据库的信息。 使用模板以便 Puppet 可以生成具有正确值的文件。

创建一个名为 templates 的新目录。

mkdir ~/MyModules/do-wordpress/templates

移动到 /tmp 目录:

cd /tmp

提取 WordPress 文件:

tar -xvzf ~/MyModules/do-wordpress/files/latest.tar.gz  # Extract the tar

您下载的 latest.tar.gz 文件包含一个 wp-config-sample.php 文件。 将文件复制到 templates 目录为 wp-config.php.erb

cp /tmp/wordpress/wp-config-sample.php ~/MyModules/do-wordpress/templates/wp-config.php.erb

清理 /tmp 目录:

rm -rf /tmp/wordpress  # Clean up

使用 nano 编辑 wp-config.php.erb 文件。

nano ~/MyModules/do-wordpress/templates/wp-config.php.erb

使用 conf.pp 中定义的变量设置 DB_NAMEDB_USERDB_PASSWORDDB_HOST 的值. 您可以使用下面显示的确切设置,这将从我们之前创建的 conf.pp 文件中提取您的实际变量。 red 中标记的项目是您需要对与数据库相关的四个行进行的确切更改。

忽略注释,您的文件应如下所示:

<?php
define('DB_NAME', '<%= scope.lookupvar('wordpress::conf::db_name') %>');
define('DB_USER', '<%= scope.lookupvar('wordpress::conf::db_user') %>');
define('DB_PASSWORD', '<%= scope.lookupvar('wordpress::conf::db_user_password') %>');
define('DB_HOST', '<%= scope.lookupvar('wordpress::conf::db_host') %>');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

$table_prefix  = 'wp_';

define('WP_DEBUG', false);

if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

require_once(ABSPATH . 'wp-settings.php');

第 9 步 - 为 Wordpress 创建清单

使用 nanomanifests 目录下创建并编辑一个名为 wp.pp 的文件:

nano ~/MyModules/do-wordpress/manifests/wp.pp

此清单执行以下操作:

  • 将 Wordpress 安装包的内容复制到 /var/www/。 必须这样做,因为 Apache 的默认配置提供来自 /var/www/ 的文件
  • 使用模板生成 wp-config.php 文件

将以下代码添加到文件中,如图所示:

class wordpress::wp {

    # Copy the Wordpress bundle to /tmp
    file { '/tmp/latest.tar.gz':
        ensure => present,
        source => "puppet:///modules/wordpress/latest.tar.gz"
    }

    # Extract the Wordpress bundle
    exec { 'extract':
        cwd => "/tmp",
        command => "tar -xvzf latest.tar.gz",
        require => File['/tmp/latest.tar.gz'],
        path => ['/bin'],
    }

    # Copy to /var/www/
    exec { 'copy':
        command => "cp -r /tmp/wordpress/* /var/www/",
        require => Exec['extract'],
        path => ['/bin'],
    }

    # Generate the wp-config.php file using the template
    file { '/var/www/wp-config.php':
        ensure => present,
        require => Exec['copy'],
        content => template("wordpress/wp-config.php.erb")
    }
}

第 10 步 - 创建 init.pp,一个集成其他清单的清单

每个 Puppet 模块都需要有一个名为 init.pp 的文件。 当外部清单包含您的模块时,将执行该文件的内容。 puppet module generate 命令已经为您创建了该文件的通用版本。

使用 nano 编辑 init.pp

nano ~/MyModules/do-wordpress/manifests/init.pp

让文件具有以下内容。

您可以将注释的解释和示例留在顶部。 wordpress 类应该有一个空块。 添加此处显示的内容,使 wordpress 块看起来如下所示。 确保正确嵌套了括号。

包含内联注释以解释设置:

class wordpress {
    # Load all variables
    class { 'wordpress::conf': }

    # Install Apache and PHP
    class { 'wordpress::web': }

    # Install MySQL
    class { 'wordpress::db': }

    # Run Wordpress installation only after Apache is installed
    class { 'wordpress::wp': 
        require => Notify['Apache Installation Complete']
    }

    # Display this message after MySQL installation is complete
    notify { 'MySQL Installation Complete':
        require => Class['wordpress::db']
    }

    # Display this message after Apache installation is complete
    notify { 'Apache Installation Complete':
        require => Class['wordpress::web']
    }

    # Display this message after Wordpress installation is complete
    notify { 'Wordpress Installation Complete':
        require => Class['wordpress::wp']
    }
}

第 11 步 - 构建 WordPress 模块

该模块现在可以构建了。 移动到 MyModules 目录:

cd ~/MyModules

使用 puppet module build 命令构建模块:

sudo puppet module build do-wordpress

您应该会看到成功构建的以下输出:

Notice: Building /home/user/MyModules/do-wordpress for release
Module built: /home/user/MyModules/do-wordpress/pkg/do-wordpress-0.1.0.tar.gz

该模块现在可以使用和共享了。 您将在模块的 pkg 目录中找到可安装包。

第 12 步 - 安装 WordPress 模块

要使用该模块,必须先安装它。 使用 puppet module install 命令。

sudo puppet module install ~/MyModules/do-wordpress/pkg/do-wordpress-0.1.0.tar.gz

安装后,当您运行 sudo puppet module list 命令时,您应该会看到类似以下的输出:

/etc/puppet/modules
├── do-wordpress (v0.1.0)
├── puppetlabs-apache (v1.1.1)
├── puppetlabs-concat (v1.1.1)
├── puppetlabs-mysql (v2.3.1)
└── puppetlabs-stdlib (v4.3.2)

现在它已经安装好了,对于任何 Puppet 命令,您应该将此模块引用为 do-wordpress

更新或卸载模块

如果您收到安装错误,或者您注意到 WordPress 的配置问题,您可能需要对我们在本教程前面创建的一个或多个清单和相关文件进行更改。

或者,您可能只是想在某个时候卸载该模块。

要更新或卸载模块,请使用以下命令:

sudo puppet module uninstall do-wordpress

如果你只是想卸载,你就完成了。

否则,进行您需要的更改,然后根据步骤 11-12 重建并重新安装模块。

第 13 步 - 使用独立清单文件中的模块安装 WordPress

要使用该模块安装 Wordpress,您必须创建一个新清单并应用它。

使用 nano/tmp 目录(或您选择的任何其他目录)中创建和编辑名为 install-wp.pp 的文件。

nano /tmp/install-wp.pp

将以下内容添加到文件中,完全如图所示:

class { 'wordpress':
}

使用 puppet apply 应用清单。 这是让 WordPress 在您的服务器上启动并运行的步骤:

sudo puppet apply /tmp/install-wp.pp

看到一两个警告很好。

这将需要一段时间才能运行,但当它完成时,您将安装并运行 Wordpress 及其所有依赖项。

最后几个成功的安装行应该是这样的:

Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/authn_core.load]/ensure: removed
Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/status.load]/ensure: removed
Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/mpm_prefork.load]/ensure: removed
Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/status.conf]/ensure: removed
Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/mpm_prefork.conf]/ensure: removed
Notice: /Stage[main]/Apache::Service/Service[httpd]: Triggered 'refresh' from 55 events
Notice: Finished catalog run in 55.91 seconds

您可以打开浏览器并访问 http://server-IP/。 您应该会看到 WordPress 欢迎屏幕。

从这里,您可以正常配置您的 WordPress 控制面板。

部署到多个服务器

如果您在 Agent-Master 配置中运行 Puppet 并希望在一台或多台远程计算机上安装 WordPress,您所要做的就是将 class {'wordpress':} 行添加到那些的 node 定义中机器。 要了解更多关于 Agent-Master 的配置和节点定义,可以参考本教程:

如何安装 Puppet 来管理您的服务器基础架构

结论

通过本教程,您学会了创建自己的 Puppet 模块来为您设置 WordPress。 您可以在此基础上进一步构建以添加对自动安装某些主题和插件的支持。 最后,当您觉得您的模块也对其他人有用时,您可以将其发布到 Puppet Forge 上。