如何在 Ubuntu 14.04 上创建 Puppet 模块以自动安装 WordPress

介绍

Puppet 是系统管理员使用的配置管理工具,用于自动化维护公司 IT 基础设施的流程. 编写单个 Puppet manifest 文件足以自动化简单的任务. 但是,当您有整个工作流程进行自动化时,最好创建并使用 Puppet 模块。

作为一个管理员,你可能会发现自己经常安装WordPress及其依赖(Apache,PHP和MySQL)。

本教程包含的内容

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

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

然后,您将创建一个简单的宣言,使用该模块在Ubuntu 14.04上设置WordPress。

前提条件

您将需要以下内容:

  • Ubuntu 14.04 服务器 * 一个 sudo用户 * 一旦你到达控制面板设置后,你会明白如何管理WordPress。

步骤 1 — 在独立模式下安装娃娃

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

创建并移动到您的下载目录:

1mkdir ~/Downloads
2cd ~/Downloads

获取包裹:

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

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

1sudo apt-get update
2sudo apt-get install puppet

Puppet 已经安装了,您可以通过键入来检查:

1sudo puppet --version

它应该打印PUPPET的版本. 在此写作时,最新的版本是 3.7.1

** 注意** : 如果您看到关于模板的警告消息,请检查步骤 2 中的解决方案。

第2步:安装Apache和MySQL模块

管理Apache和MySQL是如此常见的活动,PuppetLabs有自己的模块,我们将使用这些模块来安装和配置Apache和MySQL。

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

1sudo puppet module list

您不会找到目前安装的模块。

您可能會看到一個警告訊息說:

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

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

1sudo nano /etc/puppet/puppet.conf

编辑后,该文件应该有以下内容. 您只是在评论 templatedir 行:

 1[main]
 2logdir=/var/log/puppet
 3vardir=/var/lib/puppet
 4ssldir=/var/lib/puppet/ssl
 5rundir=/var/run/puppet
 6factpath=$vardir/lib/facter
 7#templatedir=$confdir/templates
 8
 9[master]
10# These are needed when the puppetmaster is run by passenger
11# and can safely be removed if webrick is used.
12ssl_client_header = SSL_CLIENT_S_DN
13ssl_client_verify_header = SSL_CLIENT_VERIFY

这应该删除警告信息。

安装 PuppetLabs Apache 和 MySQL 模块:

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

通过重新列出模块来验证安装:

1sudo puppet module list

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

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

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

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

1mkdir ~/MyModules
2cd ~/MyModules

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

1puppet module generate do-wordpress --skip-interview

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

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

编辑 metadata.json 文件以用 puppetlabs/stdlib 取代 puppetlabs-stdlib。

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

此编辑是由于目前在 Puppet 中打开的 bug 所必需的. 更改后,您的 metadata.json 文件应该是这样的:

 1{
 2  "name": "do-wordpress",
 3  "version": "0.1.0",
 4  "author": "do",
 5  "summary": null,
 6  "license": "Apache 2.0",
 7  "source": "",
 8  "project_page": null,
 9  "issues_url": null,
10  "dependencies": [
11    {"name":"puppetlabs/stdlib","version_requirement":">= 1.0.0"}
12  ]
13}

步骤4 - 创建一个宣言来安装Apache和PHP

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

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

使用默认参数安装Apache和PHP,我们使用prefork作为MPM(多处理模块),以最大限度地与其他库兼容。

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

 1class wordpress::web {
 2
 3    # Install Apache
 4    class {'apache': 
 5        mpm_module => 'prefork'
 6    }
 7
 8    # Add support for PHP 
 9    class {'::apache::mod::php': }
10}

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

使用Nano创建和编辑名为conf.pp的文件,在Manifest目录中。

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

此文件是您应该设置自定义配置值的位置,如密码和名称,系统上的任何其他配置文件都会从此文件中提取其值。

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

将下列代码添加到文件中. 请确保您将数据库值替换为您希望在 WordPress 中使用的自定义信息。 您最有可能希望将 db_host 设置为 localhost。

您可以或应该编辑的变量以红色标记:

 1class wordpress::conf {
 2    # You can change the values of these variables
 3    # according to your preferences
 4
 5    $root_password = 'password'
 6    $db_name = 'wordpress'
 7    $db_user = 'wp'
 8    $db_user_password = 'password'
 9    $db_host = 'localhost'
10
11    # Don't change the following variables
12
13    # This will evaluate to wp@localhost
14    $db_user_host = "${db_user}@${db_host}"
15
16    # This will evaluate to wp@localhost/wordpress.*
17    $db_user_host_db = "${db_user}@${db_host}/${db_name}.*"
18}

步骤6 - 创建MySQL的宣言

使用 nano 创建和编辑名为 db.pp 的文件:

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

这个宣言是这样做的:

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

所有上述操作均由类 ::mysql::server::mysql::client 执行。

将下列代码添加到文件中,如图所示。内置评论包括,以便更好地理解:

 1class wordpress::db {
 2
 3    class { '::mysql::server':
 4
 5        # Set the root password
 6        root_password => $wordpress::conf::root_password,
 7
 8        # Create the database
 9        databases => {
10            "${wordpress::conf::db_name}" => {
11                ensure => 'present',
12                charset => 'utf8'
13            }
14        },
15
16        # Create the user
17        users => {
18            "${wordpress::conf::db_user_host}" => {
19                ensure => present,
20                password_hash => mysql_password("${wordpress::conf::db_user_password}")
21            }
22        },
23
24        # Grant privileges to the user
25        grants => {
26            "${wordpress::conf::db_user_host_db}" => {
27                ensure     => 'present',
28                options    => ['GRANT'],
29                privileges => ['ALL'],
30                table      => "${wordpress::conf::db_name}.*",
31                user       => "${wordpress::conf::db_user_host}",
32            }
33        },
34    }
35
36    # Install MySQL client and all bindings
37    class { '::mysql::client':
38        require => Class['::mysql::server'],
39        bindings_enable => true
40    }
41}

第7步:下载最新的WordPress

下载最新的WordPress安装包从官方网站(http://wordpress.org)使用wget并将其存储在文件目录中。

创建并移动到新目录:

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

下载文件:

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

步骤 8 - 创建 wp-config.php 的模板

您可能已经知道 WordPress 需要一个 wp-config.php 文件,其中包含有关允许使用的 MySQL 数据库的信息。

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

1mkdir ~/MyModules/do-wordpress/templates

转到 /tmp 目录:

1cd /tmp

提取WordPress文件:

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

您下载的 latest.tar.gz 文件包含 wp-config-sample.php 文件. 将该文件复制到模板目录中作为 wp-config.php.erb。

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

清理 /tmp 目录:

1rm -rf /tmp/wordpress  # Clean up

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

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

使用 conf.pp 中定义的变量来设置 DB_NAME、DB_USER、DB_PASSWORD 和 DB_HOST 的值. 您可以使用下面的确切设置,这将从我们之前创建的 conf.pp 文件中提取您的实际变量。

忽略了评论,你的文件应该是这样的:

 1<?php
 2define('DB_NAME', '<%= scope.lookupvar('wordpress::conf::db_name') %>');
 3define('DB_USER', '<%= scope.lookupvar('wordpress::conf::db_user') %>');
 4define('DB_PASSWORD', '<%= scope.lookupvar('wordpress::conf::db_user_password') %>');
 5define('DB_HOST', '<%= scope.lookupvar('wordpress::conf::db_host') %>');
 6define('DB_CHARSET', 'utf8');
 7define('DB_COLLATE', '');
 8
 9define('AUTH_KEY',         'put your unique phrase here');
10define('SECURE_AUTH_KEY',  'put your unique phrase here');
11define('LOGGED_IN_KEY',    'put your unique phrase here');
12define('NONCE_KEY',        'put your unique phrase here');
13define('AUTH_SALT',        'put your unique phrase here');
14define('SECURE_AUTH_SALT', 'put your unique phrase here');
15define('LOGGED_IN_SALT',   'put your unique phrase here');
16define('NONCE_SALT',       'put your unique phrase here');
17
18$table_prefix  = 'wp_';
19
20define('WP_DEBUG', false);
21
22if ( !defined('ABSPATH') )
23    define('ABSPATH', dirname(__FILE__) . '/');
24
25require_once(ABSPATH . 'wp-settings.php');

第9步:为Wordpress创建宣言

使用 nano 创建和编辑名为 wp.pp 的文件在表现目录中:

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

这个宣言执行以下操作:

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

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

 1class wordpress::wp {
 2
 3    # Copy the Wordpress bundle to /tmp
 4    file { '/tmp/latest.tar.gz':
 5        ensure => present,
 6        source => "puppet:///modules/wordpress/latest.tar.gz"
 7    }
 8
 9    # Extract the Wordpress bundle
10    exec { 'extract':
11        cwd => "/tmp",
12        command => "tar -xvzf latest.tar.gz",
13        require => File['/tmp/latest.tar.gz'],
14        path => ['/bin'],
15    }
16
17    # Copy to /var/www/
18    exec { 'copy':
19        command => "cp -r /tmp/wordpress/* /var/www/",
20        require => Exec['extract'],
21        path => ['/bin'],
22    }
23
24    # Generate the wp-config.php file using the template
25    file { '/var/www/wp-config.php':
26        ensure => present,
27        require => Exec['copy'],
28        content => template("wordpress/wp-config.php.erb")
29    }
30}

步骤 10 - 创建 init.pp,一个集成其他宣言的宣言

每个 Puppet 模块都需要有一个名为 init.pp 的文件. 当外部宣言包含您的模块时,该文件的内容将被执行。

使用 nano 编辑 init.pp:

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

让文件具有以下内容。

你可以留下评论的解释和示例在顶部. 应该有一个空的块为WordPress类别. 添加这里显示的内容,所以WordPress块看起来像下面显示的块。

包含内置评论来解释设置:

 1class wordpress {
 2    # Load all variables
 3    class { 'wordpress::conf': }
 4
 5    # Install Apache and PHP
 6    class { 'wordpress::web': }
 7
 8    # Install MySQL
 9    class { 'wordpress::db': }
10
11    # Run Wordpress installation only after Apache is installed
12    class { 'wordpress::wp': 
13        require => Notify['Apache Installation Complete']
14    }
15
16    # Display this message after MySQL installation is complete
17    notify { 'MySQL Installation Complete':
18        require => Class['wordpress::db']
19    }
20
21    # Display this message after Apache installation is complete
22    notify { 'Apache Installation Complete':
23        require => Class['wordpress::web']
24    }
25
26    # Display this message after Wordpress installation is complete
27    notify { 'Wordpress Installation Complete':
28        require => Class['wordpress::wp']
29    }
30}

步骤 11 - 构建WordPress模块

该模块现在已经准备好建成,移动到 MyModules 目录:

1cd ~/MyModules

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

1sudo puppet module build do-wordpress

您应该从成功的构建中看到以下结果:

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

该模块现在已经准备好使用和共享,您将在模块的pkg目录中找到可安装的包。

步骤 12 - 安装WordPress模块

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

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

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

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

现在它已经安装了,您应该将此模块参考为任何Puppet命令的Do-wordpress

更新或卸载模块

如果您收到安装错误,或如果您注意到WordPress的配置问题,您可能需要对我们在教程中早些时候创建的一个或多个明示和相关文件进行更改。

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

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

1sudo puppet module uninstall do-wordpress

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

否则,请按照步骤 11-12 进行所需的更改,然后重建并重新安装模块。

步骤 13 - 在独立的宣言文件中使用模块来安装WordPress

要使用模块来安装Wordpress,你必须创建一个新的宣言,并应用它。

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

1nano /tmp/install-wp.pp

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

1class { 'wordpress':
2}

使用娃娃应用应用宣言,这是让WordPress在您的服务器上运行的步骤:

1sudo puppet apply /tmp/install-wp.pp

看到一个或两个警告是很好的。

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

最后几条成功的安装线路应该是这样的:

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

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

WordPress Welcome

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

部署到多个服务器

如果您在 Agent-Master 配置中运行 Puppet,并希望在一个或多个远程机器上安装 WordPress,您只需要在这些机器的 node 定义中添加行 `class {'wordpress':}。

如何安装Puppet来管理您的服务器基础设施

结论

借助本教程,您已经学会了如何创建自己的Puppet模块,为您设置WordPress。您可以进一步建立在此基础上,以增加自动安装某些主题和插件的支持。

Published At
Categories with 技术
comments powered by Disqus