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