Puppet - точка входа
Puppet - это комплекс утилит, написанных на Ruby, которые позволяют управлять большим количеством серверов с одной точки. Он позволяет описать необходимое состояние для каждого сервера в Вашей инфраструктуре. Создание новых серверов больше не требует кнопкокликания, заготовок/темплейтов и т.д.
Разработчики предоставили прикольную виртуалку, с помощью которой можно ознакомиться с фичами puppet. Собственно я только что закончил квэсты и хочу суммировать ключевые моменты.
Всем, кто ищет точку входа в puppet, рекомендую сначала ознакомиться с материалами предоставленными в <a href="https://puppetlabs.com/download-learning-vm" target="_blank">Learning VM</a>
и вернуться назад.
Немного теории
Манифест - текстовый файл с расширением .pp
. В манифестах описываются классы.
Класс - именованный блок кода. Как правило класс определяет тип ресурсов, которые относятся к той или иной функции или компоненту системы. При описании классов используются ресурсы.
Ресурсы - это базовые единицы для создания конфигурации, каждый из которых описывает определенную часть системы. Ресурсы описаны в коде Puppet c помощью специфического языка на базе Ruby - DSL (‘Domain Specific Language’). Разработчики и маркетологи особо не заморачивались с названием.
Манифест состоит из классов. В описании классов используются ресурсы. В манифестах и класах можно использовать переменные, условные операторы, передавать им аргументы.
Получить список всех ресурсов можно с помощью следующей команды:
puppet resource -types
Посмотреть информацию о ресурсе (ресурс user
со значением root
):
puppet resource user root
Получить описание ресурса:
puppet describe user less
Модуль - это то, что позволяет Вам организовывать код Puppet в отдельные единицы конфигурации для последующего использования. Большинство модулей находятся в каталоге, который указан как modulepath
в файле /etc/puppetlabs/puppet/puppet.conf
Modulepath
можно узнать выполнив следующую команду:
puppet agent -configprint modulepath
Puppet
ищет модули сначала в папке /etc/puppetlabs/puppet/environments/production/modules
, потом в папке /etc/puppetlabs/puppet/modules
, и в конце в папке /opt/puppet/share/puppet/modules
Установить модуль можно с помощью следующей команды:
puppet module install puppetlabs-apache
Суть работы с puppet заключается в создании модулей с манифестами.
Простенькие примеры манифестов рассматриваются в квэстах ‘Learning VM’.
Чтобы ознакомиться со структурой модуля выполните:
tree -L 2 -d /etc/puppetlabs/puppet/environments/production/modules/apache
Можете более подробно ознакомиться с содержимым.
Классы описываются в следующем файле (это уже манифест):
manifests/init.pp
Проверить манифест можно с помощью следующей команды:
puppet apply -noop manifests/init.pp
Без ключа --noop
манифест будет включен в конфигурацию Puppet.
После этого класс станет доступен в вэб-морде Puppet, где можно определить к какому серверу применяется тот или иной класс. На основе этого к серверу будет применен (или не будет) тот или иной конфиг.
Самый главный манифест находится:
/etc/puppetlabs/puppet/environments/production/manifests/site.pp
В этом файле описаны классы и переменные, которые относятся ко всем серверам в Вашем парке. Например, для ssh доступа ко всем серверам вы используете пользователя opsadmin
c ключом (id_rsa
). Было бы логично подключить класс, который создает этого пользователя в ‘Самый главный манифест’, чтобы не приходилось добавлять этот класс руками в вэб-морде puppet к каждому новому серверу.
То же самое относится к настройкам ssh. С большой вероятностью они будут одинаковыми для всех серверов.
Пример создания манифеста
Пример ssh скопирую с Learning VM.
Создаем папки модуля:
mkdir -p /etc/puppetlabs/puppet/environments/production/modules/sshd/{manifests,files}
Создаем манифест:
vim /etc/puppetlabs/puppet/environments/production/modules/sshd/manifests/init.pp
class sshd {
package {'openssh-server':
ensure => present,
before => File["/etc/ssh/sshd_config"],
}
file { '/etc/ssh/sshd_config':
ensure => file,
mode => 600,
source => 'puppet:///modules/sshd/files/sshd_config',
}
service {'sshd':
ensure => running,
enable => true,
subscribe => File['/etc/ssh/sshd_config'],
}
}
Создаем конфиг, который будет использоваться на всех Ваших серверах:
vim /etc/puppetlabs/puppet/environments/production/modules/sshd/files/sshd_config
Содержание я приводить не стану. Каждый использует настройки, которые соответствуют политике компании.
Открываем главный манифест:
vim /etc/puppetlabs/puppet/environments/production/manifests/site.pp
Ищем секцию:
node default {
...
}
Добавляем в нее:
include sshd
Проверяем:
puppet apply -noop /etc/puppetlabs/puppet/environments/production/manifests/site.pp
Если все ОК - повторяем предыдущую команду без ключа --noop
.
Что касается распространения изменений по существующим серверам, то они происходят раз в 30 минут по расписанию. Для ускорения этого процесса можно дернуть puppet agent:
puppet agent -t
Условный оператор:
В манифестах puppet допускается использование слудющих условных операторов:
- if
- case
- switch
Использование условий нужно хотя бы потому что в Вашем парке могут быть сервера под Ubuntu и Centos. В виртуалке (‘Learning VM’) рассмартивается пример добавления пользователей в разные группы, в зависимости от операционной системы.
Что же использовать в условных операторах? - Значения переменных. Чтобы получить список переменных значений от которых можно отталкиваться воспользуйтесь утилитой facter
Выполните:
facter -p less
Рассмотрите подробнее результаты выполнения. Там есть много чего полезного.
В данном примере нас интересуют значения operatingsystem
или же osfamily
.
В коде манифестов их можно определить следующи образом:
$::operatingsystem == 'centos'
$::osfamily = 'RedHat'
Пример №2
Давайте создадим манифест, согласно которого будет создаваться пользователь opsadmin
, с публичным ключем для доступа по ssh. Пользователь будет добавлен в группу wheel
на серверах с CentOS
, а на серверах с Ubuntu
- в группу admin
Создаем папки модуля:
mkdir -p /etc/puppetlabs/puppet/environments/production/modules/accounts/{manifests,files}
Создаем манифест:
vim /etc/puppetlabs/puppet/environments/production/modules/accounts/manifests/init.pp
class accounts ($name) {
if $::operatingsystem == 'centos' {
$groups = 'wheel'
}
elsif $::operatingsystem == 'debian' {
$groups = 'admin'
}
user { $name:
ensure => 'present',
home => "/home/${name}",
groups => $groups,
}
file { '/home/${name}/.ssh/authotized_keys':
ensure => file,
mode => 600,
source => 'puppet:///modules/accounts/${name}-authotized_keys',
}
}
Создаем файл, содержащий публичыный ключь пользователя opsadmin
/etc/puppetlabs/puppet/environments/production/modules/accounts/files/opsadmin-authotized_keys
Открываем главный манифест:
vim /etc/puppetlabs/puppet/environments/production/manifests/site.pp
Ищем секцию:
node default {
...
}
Добавляем в нее:
class {'accounts':
name => 'opsadmin',
}
Проверяем:
puppet apply -noop /etc/puppetlabs/puppet/environments/production/manifests/site.pp
Если все ОК - повторяем предыдущую команду без ключа --noop
.
В общем манифест получился универсальным, поскольку позволяет добавлять много пользователей с правами sudo. По аналогии можно добавлять пользователей в другие группы. К примеру команду разработчиков добавить в группу developers
. Ключи пользователей нужно складывать в следующую папку:
/etc/puppetlabs/puppet/environments/production/modules/accounts/files/
Имя файлов должно начинаться с имени пользователя.
Заключение:
В рамках приведенных примеров не сложно понять приимущества использования Puppet. Представте, что у Вас есть команда разработчиков из 20-ти людей, которые работают с проэктами на 40-ка серверах. При появлении навого человека нужно ддобавить его на все сервера. С помощью Puppet это можно сделать за считанные минуты. Столько же времени уйдет на то, что бы добавить человека на 400 серверов.
Изменение конфига ssh не нужно применять на всех серверах, в случае смены политики шифрования или еще чего-то.
Дальше я продолжу играться с манифестами по мере наличия свободного времени и буду их выкладывать в отдельных статьях.