Основы кода Puppet: манифесты и модули
Ubuntu | Комментировать запись
Для более эффективного использования Puppet нужно понимать, как строятся модули и манифесты. Данное руководство ознакомит вас с работой этих компонентов Puppet на примере настройки стека LAMP на сервере Ubuntu 14.04.
Требования
- Установка Puppet (мастер и агент). Больше об этом – здесь.
- Возможность создать хотя бы один виртуальный сервер Ubuntu 14.04 для обслуживания агентской ноды Puppet.
Основы кода Puppet
Ресурсы
Код Puppet в основном состоит из ресурсов. Ресурс – это фрагмент кода, который описывает состояние системы и определяет необходимые ей изменения. Например:
user { 'mitchell':
ensure => present,
uid => '1000',
gid => '1000',
shell => '/bin/bash',
home => '/home/mitchell'
}
Объявление ресурса имеет такой формат:
resource_type { 'resource_name'
attribute => value
...
}
Чтобы просмотреть все типы ресурсов Puppet, введите команду:
puppet resource --types
Больше о типах ресурсов вы узнаете в этом руководстве.
Манифесты
Манифест – это сценарий оркестровки. Программы Puppet с расширением .pp называются манифестами. Манифест Puppet по умолчанию – /etc/puppet/manifests/site.pp.
Классы
Как и в любом обычном языке программирования, классы отвечают за организацию и повторное использование частей оркестровки.
В определении класса находится блок кода, который описывает, как работает класс. Определив класс, вы можете использовать его в манифестах.
Определение класса имеет такой формат:
class example_class {
...
code
...
}
Этот код определяет класс example_class. Код Puppet будет находиться в фигурных скобках.
Объявление класса – это то место в коде, где вызывается тот или иной класс. С помощью объявления класса Puppet обрабатывает его код.
Объявление класса бывает обычным и по типу ресурса.
Обычное объявление класса добавляется в код с помощью ключевого слова include.
include example_class
При объявлении по типу ресурса класс объявляется в формате ресурса:
class { 'example_class': }
Такое объявление позволяет добавлять в код параметры класса, которые переопределяют стандартные значения атрибутов класса. Например:
node 'host2' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}
Модули
Модуль – это группа манифестов и других файлов, организованная заранее определенным образом, которая позволяет облегчить совместное и повторное использование отдельных частей оркестровки. Модули помогают систематизировать код Puppet, поскольку с их помощью код можно разделить на несколько манифестов.
Модули Puppet хранятся в каталоге /etc/puppet/modules.
Написание манифеста
Потренироваться писать манифесты, модули и классы Puppet можно на примере установки стека LAMP на сервер Ubuntu (в результате получится такой стек).
Итак, чтобы выполнить оркестровку сервера Ubuntu 14.04 и установить на него стек LAMP, нужны ресурсы для таких действий:
- установка пакета apache2.
- запуск сервиса apache2.
- установка пакета сервера MySQL, mysql-server.
- запуск сервиса mysql.
- установка пакета php5
- создание тестового сценария PHP, info.php.
- обновление индекса apt перед установкой каждого пакета.
Ниже вы найдете три примера кода Puppet, с помощью которого можно получить такую установку стека LAMP.
Первый пример научит писать базовые манифесты в одном файле. Второй пример поможет собрать и использовать класс и модуль на основе ранее написанных манифестов. В третьем примере вы узнаете, как пользоваться предварительно собранными общедоступными модулями для установки стека LAMP.
Примечание: Для тестирования лучше использовать свежий виртуальный сервер.
Пример 1: Установка LAMP с помощью одного манифеста
Манифест Puppet можно написать на агентской ноде, а затем выполнить его с помощью команды puppet apply (для этого не нужно иметь установку из мастера и агента).
В данном разделе вы научитесь писать манифесты, которые будут использовать такие типы объявления ресурсов:
- exec: выполнение команд.
- package: установка пакетов.
- service: управление сервисами.
- file: управление файлами.
Создание манифеста
Создайте новый манифест:
sudo vi /etc/puppet/manifests/lamp.pp
Добавьте в него следующий код, чтобы объявить необходимые ресурсы.
# запуск команды 'apt-get update'
exec { 'apt-update': # ресурс exec 'apt-update'
command => '/usr/bin/apt-get update' # команда, которую запустит этот ресурс
}
# установка пакета apache2
package { 'apache2':
require => Exec['apt-update'], # запрос 'apt-update' перед установкой пакета
ensure => installed,
}
# запуск сервиса apache2
service { 'apache2':
ensure => running,
}
# установка mysql-server
package { 'mysql-server':
require => Exec['apt-update'], # запрос 'apt-update' передустановкой
ensure => installed,
}
# запуск сервиса mysql
service { 'mysql':
ensure => running,
}
# установка пакета php5
package { 'php5':
require => Exec['apt-update'], # запрос 'apt-update' перед установкой
ensure => installed,
}
# запуск сервиса info.php
file { '/var/www/html/info.php':
ensure => file,
content => '<?php phpinfo(); ?>', # код phpinfo
require => Package['apache2'], # запрос пакета 'apache2'
}
Применение манифеста
Чтобы использовать новый манифест, введите команду:
sudo puppet apply --test
Она выведет объёмный результат, который отображает все изменения состояния среды. Если в выводе нет ошибок, вы сможете открыть свой внешний IP-адрес или доменное имя в браузере. На экране появится тестовая страница PHP с информацией о стеке. Это значит, что Apache и PHP работают.
Теперь стек LAMP установлен на сервер с помощью Puppet.
Это довольно простой манифест, поскольку его можно выполнить на агенте. Если у вас нет мастера Puppet, другие агентские ноды не смогут использовать этот манифест.
Мастер-сервер Puppet проверяет изменения состояния сервера каждые 30 минут.
Пример 2: Установка стека LAMP с помощью модуля
Теперь попробуйте создать простой модуль, основанный на манифесте LAMP, который вы написали в предыдущем разделе.
Чтобы создать модуль, создайте в каталоге modules новый каталог (его имя должно совпадать с именем модуля). В этом каталоге должны находиться каталог manifests и файл init.pp. В файле init.pp указывается класс Puppet (его имятакже должно совпадать с именем модуля).
Создание модуля
Перейдите на мастер-сервер Puppet и создайте структуру каталогов для модуля:
cd /etc/puppet/modules
sudo mkdir -p lamp/manifests
Создайте и откройте в редакторе файл init.pp:
sudo vi lamp/manifests/init.pp
В файл вставьте класс lamp:
class lamp {
}
Скопируйте содержимое манифеста из раздела 1 и вставьте его в блок класса lamp. Теперь у вас есть определение класса lamp. Другие манифесты смогут использовать этот класс в качестве модуля.
Сохраните и закройте файл.
Использование модуля в главном манифесте
Теперь можно настроить главный манифест и с помощью модуля lamp установить на сервер стек LAMP.
На мастер-сервере Puppet отредактируйте такой файл:
sudo vi /etc/puppet/manifests/site.pp
Скорее всего, на данный момент файл пуст. Добавьте в него следующие строки:
node default { }
node 'lamp-1' {
}
Примечание: Вместо lamp-1 укажите имя хоста своего агента Puppet, на который нужно установить стек.
Блок node позволяет указать код Puppet, который будет применяться только к некоторым нодам.
Блок default применяется ко всем агентским нодам, у которых нет индивидуального блока (оставьте его пустым). Блок lamp-1 будет применяться к агентской ноде lamp-1.
Добавьте в этот блок следующую строку, которая использует модуль lamp:
include lamp
Сохраните и закройте файл.
Теперь агентская нода Puppet сможет загрузить настройки с мастер-сервера и установить стек LAMP. Если вы хотите внести изменения прямо сейчас, запустите на агенте команду:
sudo puppet agent --test
Эта команда загрузит все обновления для текущей ноды и установит на неё стек. Чтобы убедиться, что Apache и PHP работают, откройте IP-адрес или домен ноды в браузере:
http://lamp_1_public_IP/info.php
Модули – это самый удобный способ повторного использования кода Puppet. Кроме того, модули помогают логически организовать код.
Пример 3: Установка LAMP с помощью общедоступных модулей
Puppet Forge – это общедоступный репозиторий модулей, с помощью которого можно быстро разработать собственную инфраструктуру.
Модули с Puppet Forge можно быстро установить с помощью команды puppet module. Здесь можно найти модули для установки Apache и MySQL, которые можно использовать при установке стека LAMP.
Установка модулей Apache и MySQL
Перейдите на мастер-сервер Puppet и установите модуль puppetlabs-apache :
sudo puppet module install puppetlabs-apache
Команда выведет такой результат:
Notice: Preparing to install into /etc/puppetlabs/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-apache (v1.0.1)
├── puppetlabs-concat (v1.0.0) [/etc/puppet/modules]
└── puppetlabs-stdlib (v3.2.0) [/etc/puppet/modules]
Затем установите puppetlabs-mysql:
sudo puppet module install puppetlabs-mysql
Теперь эти модули можно использовать.
Редактирование главного манифеста
Перейдите на мастер-сервер и отредактируйте файл:
sudo vi /etc/puppet/manifests/site.pp
Если файл пуст, добавьте в него блоки node (если вы выполнили раздел 2, в файле уже есть эти строки).
node default { }
node 'lamp-1' {
}
В блок node для ноды lamp-1 добавьте следующее объявление класса, использующее модуль apache:
class { 'apache': # использование модуля apache
default_vhost => false, # отключение стандартного виртуального хоста
default_mods => false, # отключение стандартных модулей
mpm_module => 'prefork', # использование модуля prefork
}
include apache::mod::php # добавление mod php
apache::vhost { 'example.com': # создание виртуального хоста example.com
port => '80', # настройка порта 80
docroot => '/var/www/html', # определение корневого каталога /var/www/html
}
Параметры модуля apache могут переопределять стандартное поведение модуля.
Указанные базовые параметры отключат стандартный виртуальный хост и создадут новый виртуальный хост с поддержкой PHP.
Больше информации можно найти здесь.
Модуль MySQL используется аналогичным образом. Добавьте в блок ноды такие строки:
class { 'mysql::server':
root_password => 'password',
}
Также можно передать параметры модуля MySQL.
Добавьте ресурс, который скопирует info.php в нужное место. Используйте параметр source. Добавьте в блок node следующие строки:
file { 'info.php': # имя файла ресурса
path => '/var/www/html/info.php', # целевой путь
ensure => file,
require => Class['apache'], # класс apache, который нужно использовать
source => 'puppet:///modules/apache/info.php', # место, куда нужно скопировать файл
}
В этом объявлении класса используется параметр source вместо content. Этот параметр не только использует содержимое файла, но и копирует его.
Файл puppet:///modules/apache/info.php Puppet скопирует в /etc/puppet/modules/apache/files/info.php.
Сохраните и закройте файл.
Создайте файл info.php.
sudo sh -c 'echo "<?php phpinfo(); ?>" > /etc/puppet/modules/apache/files/info.php'
Теперь агентская нода Puppet сможет загрузить настройки с мастер-сервера и установить стек LAMP. Если вы хотите внести изменения в среду агента прямо сейчас, запустите на этой ноде команду:
sudo puppet agent --test
Эта команда загрузит все обновления для текущей ноды и установит на неё стек. Чтобы убедиться, что Apache и PHP работают, откройте IP-адрес или домен ноды в браузере:
http://lamp_1_public_IP/info.php
Заключение
Теперь вы имеете базовые навыки работы с модулями и манифестами Puppet. Попробуйте самостоятельно создать простой манифест и модуль.
Puppet отлично подходит для управления конфигурационными файлами приложений.
Tags: LAMP stack, Puppet, Ubuntu 14.04