Создание модуля Puppet для автоматизации установки WordPress в Ubuntu 14.04
Ubuntu | Комментировать запись
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.
c
lass 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: Puppet, Ubuntu 14.04, WordPress