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

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


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

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

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

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

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

root@puppet:~# apt-get install puppetmaster

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

root@linux:~# apt-get install puppet

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

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

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

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

root@linux:~# 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

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

root@puppet:~# puppetca --list
  "linux.local" (E5:EA:AC:5B:22:9A:BA:42:B8:A1:63:9E:1F:1F:23:51)
root@puppet:~# 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'

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

root@linux:~# 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 ищет модули:

root@puppet:~# puppet apply --configprint modulepath
/etc/puppet/modules:/usr/share/puppet/modules

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

root@puppet:~# cd /etc/puppet/modules
root@puppet:~# 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
}

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

root@puppet:~# 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

На клиенте:

root@linux:~# ll /etc/hosts
rw-r--r-- 1 root root 290 Dec 16 19:10 /etc/hosts
root@linux:~# 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
root@linux:~# 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

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

root@linux:~# service puppet start

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

2 комментария “Устанавливаем puppet и создаем свой первый манифест”

Комментирование закрыто.