Создание модуля Puppet для автоматизации установки WordPress в Ubuntu 14.04

Puppet – это инструмент управления конфигурациями, который позволяет автоматизировать оркестровку и настройки инфраструктуры. Манифесты Puppet способны автоматизировать простые задачи. Для автоматизации сложных процессов, состоящих из нескольких этапов, используются модули Puppet.

По сути, модуль Puppet – это набор манифестов и вспомогательных файлов, который можно повторно использовать.

WordPress – это популярная система управления контентом. Системным администраторам довольно часто приходится устанавливать WordPress и зависимости (Apache, PHP и MySQL). Этот процесс можно автоматизировать с помощью модуля Puppet.

Данное руководство поможет создать модуль, который выполняет такие задачи:

  • Установка Apache и PHP.
  • Установка MySQL.
  • Создание БД и пользователя MySQL для WordPress.
  • Установка и настройка WordPress.

Также здесь вы узнаете, как написать простой манифест, который установит WordPress на сервер Ubuntu 14.04.

Требования

  • Сервер Ubuntu 14.04.
  • Пользователь с доступом к sudo (инструкции можно найти здесь).
  • Базовые навыки установки WordPress в браузере (информацию можно найти в последнем разделе руководства Установка WordPress на Ubuntu 14.04).

1: Установка Puppet

Чтобы установить Puppet с помощью пакетного менеджера apt, добавьте репозиторий Puppet Labs, в котором можно найти специальный пакет для Debian. Название пакета зависит от версии Ubuntu, которую вы используете. Для Ubuntu 14.04 предназначен пакет 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

Установите Puppet с помощью apt-get.

sudo apt-get update
sudo apt-get install puppet

Установка 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')

Чтобы устранить это предупреждение, откройте puppet.conf и закомментируйте строку templatedir.

sudo nano /etc/puppet/puppet.conf

Затем закомментируйте эту строку:

[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

После этого предупреждение исчезнет.

Установите модули Apache и MySQL из PuppetLabs.

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

Предположим, модуль будет называться my-wordpress. Сгенерируйте новый модуль:

puppet module generate my-wordpress --skip-interview

Флаг –skip-interview переводит команду в неинтерактивный режим (теперь она не будет запрашивать данные для файла metadata.json).

Теперь у вас есть каталог my-wordpress, в котором хранятся шаблоны кода и структура каталогов для построения модуля.

Отредактируйте файл metadata.json и замените puppetlabs-stdlib на puppetlabs/stdlib.

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

Это изменение необходимо, чтобы исправить баг Puppet. После поправки файл metadata.json будет выглядеть так:

{
"name": "my-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

В каталоге manifests создайте файл web.pp, который установит Apache и PHP.

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

Установите Apache и PHP со стандартными настройками. Используйте prefork, чтобы увеличить совместимость с другими библиотеками.

Добавьте в файл следующий код:

class wordpress::web {
# Install Apache
class {'apache':
mpm_module => 'prefork'
}
# Add support for PHP
class {'::apache::mod::php': }
}

5: Создание файла для переменных

Создайте файл conf.pp в каталоге manifests.

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

В этом файле будут храниться пользовательские настройки (пароли и имена). Все остальные файлы смогут получать эти значения из этого файла.

Если в дальнейшем вы захотите изменить конфигурацию WordPress/MySQL, достаточно просто изменить этот файл.

Добавьте в файл следующий код, указав свои данные WordPress; в db_host можно оставить localhost.

Примечание: Обязательно измените rootpassword и db_user_password.

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

В каталоге manifests создайте файл db.pp:

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

Этот манифест:

  • Устанавливает сервер MySQL.
  • Устанавливает root-пароль MySQL.
  • Создаёт БД для 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

Загрузите последнюю версию WordPress с официального сайта.

Создайте каталог files и откройте его:

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

Загрузите пакет:

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

8: Создание шаблона для wp-config.php

В wp-config.php хранится информация о базе данных MySQL, предназначенной для WordPress. Создайте шаблон файла, чтобы система Puppet могла при необходимости сгенерировать его.

Создайте каталог templates:

mkdir ~/MyModules/my-wordpress/templates

Откройте каталог /tmp:

cd /tmp

Извлеките файлы WordPress:

tar -xvzf ~/MyModules/my-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/my-wordpress/templates/wp-config.php.erb

Очистите каталог /tmp:

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

Используйте переменные, которые вы определили в файле conf.pp, чтобы определить значения DB_NAME, DB_USER, DB_PASSWORD и DB_HOST. Предложенные ниже настройки загрузят значения из файла conf.pp.

Файл будет выглядеть так (комментарии опущены):

<?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

В каталоге manifests создайте файл wp.pp.

nano ~/MyModules/my-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

Манифест init.pp объединяет все другие манифесты.

Каждому модулю Puppet необходим файл init.pp. Он исполняется в случае, если данный модуль используют внешние манифесты. Команда puppet module generate уже создала исходную версию такого файла. Отредактируйте его:

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

Комментарии и примеры в начале файла можно оставить. Вставьте следующий код в пустой блок класса 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

Соберите модуль с помощью команды:

sudo puppet module build my-wordpress

Если сборка прошла успешно, вы получите такой вывод:

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

Теперь модуль можно использовать и распространять. Связку для установки можно найти в каталоге pkg.

12: Установка модуля WordPress

Чтобы установить модуль WordPress, введите команду:

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

После установки вы получите такой вывод:

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

Теперь на этот модуль можно ссылаться по имени my-wordpress в командах Puppet.

Обновление и удаление модуля

Если во время установки произошла ошибка или настройки WordPress не соответствуют требованиям, нужно внести изменения в некоторые манифесты и сопровождающие файлы.

Также со временем модуль может понадобиться удалить.

Чтобы обновить или удалить модуль, используйте команду:

sudo puppet module uninstall my-wordpress

Модуль будет удалён.

Если вы хотите изменить некоторые настройки или внести поправки в манифесты, а затем собрать и снова установить модуль, повторите действия, описанные в разделах 11-12.

13: Использование модуля в отдельном файле

Чтобы использовать модуль для установки WordPress, нужно создать новый манифест и применить его.

Создайте файл install-wp.pp в каталоге /tmp.

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.

Многоузловое развёртывание Puppet

Если вы используете Puppet в режиме агент-мастер и хотите установить WordPress на одну или несколько удалённых машин, добавьте строку class {‘wordpress’:} в блоки node, предназначенные для этих машин.

Читайте также: Основы кода Puppet: манифесты и модули

Tags: , ,

Добавить комментарий