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


Когда число серверов, которыми вы управляете меньше десяти — редко кто задумывается об их централизованном управлении, этого может и не требоваться. Когда серверов десятки — централизованное управление ПО и конфигурациями крайне полезно. Когда серверов сотни и тысячи — это жизненно необходимо. Программ такого рода много, например: 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

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

root@:~# 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 на предмет изменения конфигурации и, при необходимости, производить соответствующую настройку системы.


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

  • Rascal От автора

    Нет. К счастью или к сожалению, не работал с WHM/cPanel.

  • Роман

    Спасибо за статью!
    Столкнулся с проблемой установки puppet-client-а на серверах с установленной WHM/cPanel с системой CentOS6.5
    Никакие репозитории, предустановки не помогают, всегда одни и теже ошибки зависимостей:
    Error: Package: 1:facter-2.0.1-1.el6.x86_64 (puppetlabs-products)
    Requires: ruby >= 1.8.7
    Error: Package: hiera-1.3.2-1.el6.noarch (puppetlabs-products)
    Requires: rubygem-json
    Error: Package: hiera-1.3.2-1.el6.noarch (puppetlabs-products)
    Requires: /usr/bin/ruby
    Error: Package: puppet-3.5.1-0.1rc1.el6.noarch (puppetlabs-devel)
    Requires: ruby-rgen >= 0.6.5
    Error: Package: puppet-3.5.1-0.1rc1.el6.noarch (puppetlabs-devel)
    Requires: ruby-shadow
    Error: Package: puppet-3.5.1-0.1rc1.el6.noarch (puppetlabs-devel)
    Requires: ruby-augeas
    Error: Package: hiera-1.3.2-1.el6.noarch (puppetlabs-products)
    Requires: ruby >= 1.8.5
    Error: Package: puppet-3.5.1-0.1rc1.el6.noarch (puppetlabs-devel)
    Requires: ruby >= 1.8.7
    Error: Package: puppet-3.5.1-0.1rc1.el6.noarch (puppetlabs-devel)
    Requires: /usr/bin/ruby
    Error: Package: 1:facter-2.0.1-1.el6.x86_64 (puppetlabs-products)
    Requires: /usr/bin/ruby
    Error: Package: puppet-3.5.1-0.1rc1.el6.noarch (puppetlabs-devel)
    Requires: rubygem-json
    Error: Package: puppet-3.5.1-0.1rc1.el6.noarch (puppetlabs-devel)
    Requires: ruby >= 1.8
    You could try using —skip-broken to work around the problem

    # rpm -qa | egrep ‘epel|puppet|rbel’
    rbel6-release-1.0-2.el6.noarch
    puppetlabs-release-6-10.noarch
    epel-release-6-8.noarch
    # cat /etc/redhat-release
    CentOS release 6.5 (Final)
    # ruby -v
    ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]

    yum search ruby не находит упорно. с enablerepo и т.п. вариации перепробованы.
    В чистой CentOS или любой другой без WHM/cPanel проблемы такой нет.

    Не встречали такое?

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