Устанавливаем puppet и создаем свой первый манифест

Когда число серверов, которыми вы управляете меньше десяти — редко кто задумывается об их централизованном управлении, этого может и не требоваться. Когда серверов десятки — централизованное управление ПО и конфигурациями крайне полезно. Когда серверов сотни и тысячи — это жизненно необходимо. Программ такого рода много, например: Chef, CFEngine, … Вот о последнем и пойдет речь в этой записи.


Puppet по достоинству считается одним из лучших решений в этом роде. Его используют такие компании как Google, Citrix и Red Hat. Это собой клиент-серверное приложение написанное на языке программирования Ruby, которое распространяется в двух вариантах:

  • Puppet Open Source — полностью бесплатная версия
  • Puppet Enterprise — бесплатная в конфигурации до 10 серверов, далее требуется приобретение лицензий

Более подробно о версиях

Рассмотрим установку сервера и агента Puppet Open Source, которые присутствует в пакетах большинства современных дистрибутивов. Далее речь пойдет о Ubuntu 12.04 Precise Pangolin.

Серверная часть Puppet называется puppetmaster, начнем установку с нее:

 [email protected]:~# apt-get install puppetmaster 

А теперь клиент:

 [email protected]:~# apt-get install puppet 

В конфигурационном файле клиента /etc/puppet/puppet.conf необходимо рассказать о сервере, добавив следующую секцию:

 [agent] server=puppet.local report=true pluginsync=false 

На первоначальном этапе pluginsync лучше выключить.

Запустим клиент puppet чтобы он создал запрос на получение сертификата:

 [email protected]:~# puppetd --verbose --test info: Creating a new SSL key for linux.local info: Caching certificate for ca info: Creating a new SSL certificate request for linux.local info: Certificate Request fingerprint (md5): E5:EA:AC:5B:22:9A:BA:42:B8:A1:63:9E:1F:1F:23:51 Exiting; no certificate found and waitforcert is disabled 

На сервере необходимо проверить что запрос сертификата получен и, если это так, выписываем сертификат:

 [email protected]:~# puppetca --list "linux.local" (E5:EA:AC:5B:22:9A:BA:42:B8:A1:63:9E:1F:1F:23:51) [email protected]:~# puppetca --sign linux.local notice: Signed certificate request for linux.local notice: Removing file Puppet::SSL::CertificateRequest linux.local at '/var/lib/puppet/ssl/ca/requests/linux.local.pem' 

Повторяем предыдущий шаг на клиенте:

 [email protected]:~# puppetd --verbose --test info: Caching certificate for linux.local info: Retrieving plugin info: Caching certificate_revocation_list for ca info: Caching catalog for linux.local info: Applying configuration version '1356278451' info: Creating state file /var/lib/puppet/state/state.yaml notice: Finished catalog run in 0.02 seconds 

Отлично, все работает. Переходим к созданию первого манифеста. Манифесты, они же конфигурации описываются на специальном декларативном языке. Будем сразу приучаться к хорошему, использовать модульную структуру и классы. Для примера напишем модуль который будет поддерживать в актуальном виде файл /etc/hosts на всех наших серверах.

Проверим, где puppet ищет модули:

 [email protected]:~# puppet apply --configprint modulepath /etc/puppet/modules:/usr/share/puppet/modules 

Создаем каталоги для своего модуля

 [email protected]:~# cd /etc/puppet/modules [email protected]:~# mkdir hosts; cd hosts; mkdir manifests; cd manifests 

Первый манифест, он же основной файл модуля — должен называться init.pp

 class hosts { # puppet.local host { 'puppet.local': ensure => 'present', target => '/etc/hosts', ip => '192.168.0.1', host_aliases => 'puppet', } # linux.local host { 'linux.local': ensure => 'present', target => '/etc/hosts', ip => '192.168.0.2', host_aliases => 'linux', } } 

По-умолчанию puppet ищет файл /etc/puppet/manifests/site.pp чтобы загрузить конфигурацию, приведем его к следующему виду:

 node default { include hosts } 

Проверяем манифест на сервере:

 [email protected]:~# puppet apply --verbose /etc/puppet/manifests/site.pp info: Applying configuration version '1356281036' notice: /Stage[main]//Host[puppet.local]/ensure: created info: FileBucket adding {md5}883e52b804df8c8b39a23c41386cbac2 notice: /Stage[main]//Host[linux.local]/ensure: created notice: Finished catalog run in 0.03 seconds 

На клиенте:

 [email protected]:~# ll /etc/hosts rw-r--r-- 1 root root 290 Dec 16 19:10 /etc/hosts [email protected]:~# puppetd --verbose --test info: Caching catalog for linux.local info: Applying configuration version '1356283380' info: FileBucket adding {md5}c49061d02c72a701e5a4dfb27bb38f73 notice: /Stage[main]/Hosts/Host[puppet.local]/ensure: created notice: /Stage[main]/Hosts/Host[linux.local]/ensure: created notice: Finished catalog run in 0.04 seconds [email protected]:~# ll /etc/hosts -rw-r--r-- 1 root root 551 Dec 23 20:43 /etc/hosts 

После того как мы убедились что все работает, разрешаем запуск службы, в /etc/default/puppet меняем:

 # Start puppet on boot? START=yes 

Запускаем службу

 [email protected]:~# service puppet start 

Puppet будет каждые 30 минут опрашивать сервер puppetmaster на предмет изменения конфигурации и, при необходимости, производить соответствующую настройку системы.