Puppet: различия между версиями
Pav (обсуждение | вклад) |
Зануда (обсуждение | вклад) |
||
(не показано 20 промежуточных версий 7 участников) | |||
Строка 1: | Строка 1: | ||
{{stub}} | {{stub}} | ||
== Установка puppet agent и puppet server == | |||
Необходимо установить следующие пакеты: | Необходимо установить следующие пакеты: | ||
< | <syntaxhighlight lang="bash"># apt-get install puppet puppetserver java-11-openjdk</syntaxhighlight> можно и более свежую версию java | ||
== Настройка puppet master == | |||
Прежде всего нужно настроить ваш dns сервер на резолва адресов. | Прежде всего нужно настроить ваш dns сервер на резолва адресов. | ||
Для примера можно внести настройки в файл {{path|/etc/hosts}}: | Для примера можно внести настройки в файл {{path|/etc/hosts}}: | ||
< | <syntaxhighlight lang="ini"> | ||
127.0.0.1 localhost.localdomain localhost | |||
10.10.3.107 puppetserver | 10.10.3.107 puppetserver | ||
10.10.3.5 puppetclient</ | 10.10.3.5 puppetclient</syntaxhighlight> | ||
После установки всех пакетов настройки dns, конфигурационные файлы puppet находятся в директории {{path|/etc/puppet/}}. Измените файл настройки {{path|/etc/puppet/puppet.conf}} так: | После установки всех пакетов настройки dns, конфигурационные файлы puppet находятся в директории {{path|/etc/puppet/}}. Измените файл настройки {{path|/etc/puppet/puppet.conf}} так: | ||
< | <syntaxhighlight lang="ini"> | ||
[main] | [main] | ||
certname=puppetserver | certname=puppetserver | ||
Строка 22: | Строка 21: | ||
[master] | [master] | ||
certname=puppetserver | certname=puppetserver | ||
environment=production</ | environment=production</syntaxhighlight> | ||
Для создания файлов на агентах нужно отредактировать файл {{path|/etc/puppet/fileserver.conf}}: | |||
<syntaxhighlight lang="ini">[files] | |||
path /etc/puppet/code/modules/files | |||
allow *</syntaxhighlight> | |||
Для подписи всех сертификатов необходимо выполнить команду: | * в секции '''main''' находятся глобальные настройки сервиса, а в секции '''master''', находятся настройки сервера puppet; | ||
< | * параметр '''server''' говорит клиенту, с каким сервером работать; | ||
* параметр '''certname''' задает имя с которым клиент будет обращаться к серверу. | |||
Запуск сервисов: | |||
<syntaxhighlight lang="bash"> | |||
# systemctl enable --now puppet | |||
# systemctl enable --now puppetserver</syntaxhighlight> | |||
Для подписи всех сертификатов необходимо выполнить команду: | |||
<syntaxhighlight lang="bash"># puppetserver ca sign --all </syntaxhighlight> | |||
== Настройка агента puppet == | |||
Для примера на клиенте также был настроен файл {{path|/etc/hosts}}, как показано выше. | |||
Файл настроек агента {{path|/etc/puppet/puppet.conf}} должен выглядеть следующим образом:<br> | Файл настроек агента {{path|/etc/puppet/puppet.conf}} должен выглядеть следующим образом:<br> | ||
< | <syntaxhighlight lang="ini">[agent] | ||
server=puppetserver</ | server=puppetserver</syntaxhighlight> | ||
Однако, вместо ''puppetserver'' вы можете подставить, при необходимости, имя вашего сервера. | Однако, вместо ''puppetserver'' вы можете подставить, при необходимости, имя вашего сервера. | ||
{{Attention|При выключенной службе foreman необходимо выключить параметр '''external_nodes''' в ''/etc/puppet/puppet.conf'' и перезапустить службу '''puppet'''}} | |||
Для проверки работы агента необходимо выполнить команду: | |||
<syntaxhighlight lang="bash"># puppet agent -t</syntaxhighlight> | |||
== Запуск puppet == | |||
= | Разрешаем самозапуск службы puppet, и перезапускаем её: | ||
<syntaxhighlight lang="bash"> | |||
# systemctl enable puppet | |||
# systemctl restart puppet | |||
</syntaxhighlight> | |||
== puppetd == | |||
{{todo|* В соответствии с http://reductivelabs.com/trac/puppet/wiki/CertificatesAndSecurity при первом запуске puppetd клиента, необходимо обратиться к серверу с запросом подписания сертификата. Для этого puppetd должен быть запущен с ключом <tt>--waitforcert</tt>. Предлагаю исправить /etc/init.d/puppetd -- добавить режим sign, при котором puppetd стартует с этой опцией. | {{todo|* В соответствии с http://reductivelabs.com/trac/puppet/wiki/CertificatesAndSecurity при первом запуске puppetd клиента, необходимо обратиться к серверу с запросом подписания сертификата. Для этого puppetd должен быть запущен с ключом <tt>--waitforcert</tt>. Предлагаю исправить /etc/init.d/puppetd -- добавить режим sign, при котором puppetd стартует с этой опцией. | ||
* Необходимо добавить в /etc/init.d/puppetd проверку на задание переменной PUPPET_SERVER, чтобы при старте происходило подключение к последнему. А то висит процесс, вроде всё работает, но на самом деле клиент ничего не делает -- не знает ip-сервера.}} | * Необходимо добавить в /etc/init.d/puppetd проверку на задание переменной PUPPET_SERVER, чтобы при старте происходило подключение к последнему. А то висит процесс, вроде всё работает, но на самом деле клиент ничего не делает -- не знает ip-сервера.}} | ||
== Создание манифестов и модулей puppet == | |||
Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в {{path|/etc/puppet}}: | Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в {{path|/etc/puppet}}: | ||
< | <syntaxhighlight lang="ini">code | ||
modules | modules | ||
environments | environments | ||
manifests</ | manifests</syntaxhighlight> | ||
Внесем корректировки в файл {{path|/etc/puppet/puppet.conf}}: | Внесем корректировки в файл {{path|/etc/puppet/puppet.conf}}: | ||
< | <syntaxhighlight lang="ini">[master] | ||
environment=production</ | environment=production</syntaxhighlight> | ||
Это добавляет окружение '''production''' в сервер. | Это добавляет окружение '''production''' в сервер. | ||
{{Attention|puppetmaster берёт информацию о манифестах | {{Attention|puppetmaster берёт информацию о манифестах из {{path|/etc/puppet/environments/production/manifests}}.}} | ||
В папке {{path|/etc/puppet/environments/production/manifests}},необходимо создать файл {{path|site.pp}} | В папке {{path|/etc/puppet/environments/production/manifests}}, необходимо создать файл {{path|site.pp}} со следующим содержимым: | ||
<syntaxhighlight lang="ini">file { "/etc/passwd": | |||
< | |||
owner => "root", | owner => "root", | ||
group => "bin", | group => "bin", | ||
mode => "644", | mode => "644", | ||
}</ | }</syntaxhighlight> | ||
Все обновление манифестов происходят автоматически. На агентах опрос сервера на предмет новых манифестов составляет 30 минут. | Все обновление манифестов происходят автоматически. На агентах опрос сервера на предмет новых манифестов составляет 30 минут. | ||
Для ускорения обновления конфигурации на агенте используется команда: | |||
<syntaxhighlight lang="bash"># puppet agent -t --debug</syntaxhighlight> | |||
Ключ --debug используется для наглядной демонстрации применения манифеста на агенте. | Ключ --debug используется для наглядной демонстрации применения манифеста на агенте. | ||
Проверка выполнения конкретного манифеста: | Проверка выполнения конкретного манифеста: | ||
< | <syntaxhighlight lang="bash"># puppet apply /etc/puppet/environments/production/manifests/site.pp | ||
Notice: Compiled catalog for puppet in environment production in 0.02 seconds | Notice: Compiled catalog for puppet in environment production in 0.02 seconds | ||
Notice: /Stage[main]/Main/File[/etc/passwd]/group: group changed 'root' to 'bin' | Notice: /Stage[main]/Main/File[/etc/passwd]/group: group changed 'root' to 'bin' | ||
Notice: Applied catalog in 0.03 seconds</ | Notice: Applied catalog in 0.03 seconds</syntaxhighlight> | ||
==== Работа с сертификатами | Ещё пример манифеста (для установки apache2 используется ресурс exec apt-get): | ||
<syntaxhighlight lang="ini">exec { 'apt-update': | |||
command => '/usr/bin/apt-get update' | |||
} | |||
package { 'tree': | |||
ensure => installed, | |||
} | |||
package { 'apache2': | |||
require => Exec['apt-update'], | |||
ensure => installed, | |||
} | |||
file { '123': | |||
ensure => file, | |||
path => '/etc/123.txt', | |||
source => 'puppet:///files/123.txt', | |||
owner => 'root', | |||
group => 'root', | |||
mode => '0777', | |||
}</syntaxhighlight> | |||
== Работа с сертификатами == | |||
По умолчанию при запуске после установки '''puppetserver''' выполняет функцию CA сервера, и генерирует сертификаты в каталоге ''/etc/puppet/ssl''. | По умолчанию при запуске после установки '''puppetserver''' выполняет функцию CA сервера, и генерирует сертификаты в каталоге ''/etc/puppet/ssl''. | ||
Строка 109: | Строка 143: | ||
{{Attention|Включить/отключить функцию '''рuppetserver ca''' можно в файле ''/etc/puppetserver/services.d/ca.cfg''.}} | {{Attention|Включить/отключить функцию '''рuppetserver ca''' можно в файле ''/etc/puppetserver/services.d/ca.cfg''.}} | ||
== Настройка puppet для работы с Foreman == | |||
Создание конфигурационного файла {{path|/etc/puppet/puppet.conf}} производится в процессе установки. | |||
Пред первым запуском puppetserver необходимо закомментировать следующие строки в файле | Пред первым запуском puppetserver необходимо закомментировать следующие строки в файле {{path|/etc/puppet/puppet.conf}}: | ||
< | <syntaxhighlight lang="ini">[master] | ||
... | |||
</ | # external_nodes = /usr/lib/puppet-modules/theforeman-foreman/files/external_node_v2.rb | ||
{{Attention|Раскомментировать строки выше потребуется после установки и запуска сервиса '''Foreman''' }} | # node_terminus = exec | ||
Чтобы дать возможность обрабатывать запросы о окружении Puppet Server редактируем файл | </syntaxhighlight> | ||
< | {{Attention|Если в системе установлен пакет '''puppet-puppetserver-foreman''', необходимо закомментировать строки | ||
<syntaxhighlight lang="ini">[master] | |||
... | |||
# external_nodes = /usr/lib/puppet-modules/puppetserver-foreman/files/enc.rb | |||
# node_terminus = exec | |||
</syntaxhighlight>}} | |||
Проверяем наличие файла {{path|/etc/puppet/autosign.conf}} и установленные на него разрешения: | |||
<syntaxhighlight lang="bash"> | |||
# touch /etc/puppet/autosign.conf | |||
# chmod 664 /etc/puppet/autosign.conf | |||
</syntaxhighlight> | |||
{{Attention|Раскомментировать строки выше потребуется после установки и запуска сервиса '''Foreman''' и к нему подключен(-ы) '''Smart_Proxy''' }} | |||
Чтобы дать возможность обрабатывать запросы о окружении Puppet Server редактируем файл {{path|/etc/puppet/auth.conf}}: | |||
<syntaxhighlight lang="ini">path /puppet/v3/environment_classes | |||
method find | method find | ||
allow * | allow * | ||
</ | </syntaxhighlight> | ||
Cоздаем файл | Cоздаем файл {{path|/etc/puppet/foreman.yaml}}: | ||
< | <syntaxhighlight lang="ini">--- | ||
# Update for your Foreman and Puppet master hostname(s) | # Update for your Foreman and Puppet master hostname(s) | ||
:url: | :url: "http://sample.server.name:2345" | ||
:ssl_ca: "/etc/puppet/ssl/certs/ca.pem" | :ssl_ca: "/etc/puppet/ssl/certs/ca.pem" | ||
:ssl_cert: "/etc/puppet/ssl/certs/sample.server.name.pem" | :ssl_cert: "/etc/puppet/ssl/certs/sample.server.name.pem" | ||
Строка 135: | Строка 185: | ||
:timeout: 10 | :timeout: 10 | ||
:threads: null | :threads: null | ||
</ | </syntaxhighlight> | ||
Разрешаем самозапуск служб puppetserver, puppet, и запускаем их: | Разрешаем самозапуск служб puppetserver, puppet, и запускаем их: | ||
< | <syntaxhighlight lang="bash"> | ||
systemctl | # systemctl enable --now puppetserver | ||
# systemctl enable --now puppet | |||
</ | </syntaxhighlight> | ||
== Пример использования Puppet + PuppetDB для инвентаризация управляемых машин == | == Пример использования Puppet + PuppetDB для инвентаризация управляемых машин == | ||
Рассмотрим на примере. Допустим системный администратор имеет три slave сервера (''10.0.1.1, 10.0.2.1, 10.0.3.1'') и один master (''10.1.0.1''). Ему необходимо в автоматическом режиме узнать серийный номер каждой машины и закешировать результаты PuppetDB. Для этого первоначально необходимо настроить Puppet, как на сервере, так и на управляемых машинах (агентах). | Рассмотрим на примере. Допустим системный администратор имеет три slave сервера (''10.0.1.1, 10.0.2.1, 10.0.3.1'') и один master (''10.1.0.1''). Ему необходимо в автоматическом режиме узнать серийный номер каждой машины и закешировать результаты PuppetDB. Для этого первоначально необходимо настроить Puppet, как на сервере, так и на управляемых машинах (агентах). | ||
Добавим в {{path|/etc/hosts}} (как на master машине так и на агентах) наши адреса: | Добавим в {{path|/etc/hosts}} (как на master машине так и на агентах) наши адреса: | ||
< | <syntaxhighlight lang="ini"> | ||
10.1.0.1 master.example.com puppet | 10.1.0.1 master.example.com puppet | ||
10.0.1.1 agent1.example.com | 10.0.1.1 agent1.example.com | ||
10.0.2.1 agent2.example.com | 10.0.2.1 agent2.example.com | ||
10.0.3.1 agent3.example.com | 10.0.3.1 agent3.example.com | ||
</ | </syntaxhighlight> | ||
Установим необходимые пакеты на master сервере | Установим необходимые пакеты на master сервере: | ||
< | <syntaxhighlight lang="bash"> | ||
# apt-get install puppet puppet-server postgresql10-server postgresql10-contrib puppetdb-terminus | # apt-get install puppet puppet-server postgresql10-server postgresql10-contrib puppetdb-terminus | ||
</ | </syntaxhighlight> | ||
..и на агентах: | ..и на агентах: | ||
< | <syntaxhighlight lang="bash"> | ||
# apt-get install puppet | # apt-get install puppet | ||
</ | </syntaxhighlight> | ||
Сконфигурируем Puppet, изменив содержимое {{path|/etc/puppet/puppet.conf}} на следующее: | Сконфигурируем Puppet, изменив содержимое {{path|/etc/puppet/puppet.conf}} на следующее: | ||
< | <syntaxhighlight lang="ini"> | ||
[main] | [main] | ||
logdir=/var/log/puppet | logdir=/var/log/puppet | ||
Строка 173: | Строка 224: | ||
ssl_client_header = SSL_CLIENT_S_DN | ssl_client_header = SSL_CLIENT_S_DN | ||
ssl_client_verify_header = SSL_CLIENT_VERIFY | ssl_client_verify_header = SSL_CLIENT_VERIFY | ||
</ | </syntaxhighlight> | ||
Если Puppet уже присутствовал в | Если Puppet уже присутствовал в системе то: | ||
< | <syntaxhighlight lang="bash"> | ||
# rm -rf /etc/puppet/ssl | # rm -rf /etc/puppet/ssl | ||
</ | </syntaxhighlight> | ||
SSL сертификаты Puppet сгенерирует самостоятельно при запуске: | SSL сертификаты Puppet сгенерирует самостоятельно при запуске: | ||
< | <syntaxhighlight lang="bash"> | ||
# systemctl start puppetmaster | # systemctl start puppetmaster | ||
# systemctl start puppet | # systemctl start puppet | ||
</ | </syntaxhighlight> | ||
Настроим агенты, указав адрес master сервера в {{path|/etc/puppet/puppet.conf}}: | Настроим агенты, указав адрес master сервера в {{path|/etc/puppet/puppet.conf}}: | ||
< | <syntaxhighlight lang="ini"> | ||
[agent] | [agent] | ||
server=master.example.com | server=master.example.com | ||
</ | </syntaxhighlight> | ||
После чего можно сгенерировать сертификаты на агентах: | После чего можно сгенерировать сертификаты на агентах: | ||
< | <syntaxhighlight lang="bash"> | ||
# rm -rf /etc/puppet/ssl/ | # rm -rf /etc/puppet/ssl/ | ||
# puppet agent -t | # puppet agent -t | ||
</ | </syntaxhighlight> | ||
После того, как сертификаты будут готовы, их можно проверить в очереди на подпись на master сервере | После того, как сертификаты будут готовы, их можно проверить в очереди на подпись на master сервере: | ||
< | <syntaxhighlight lang="bash"> | ||
# puppet cert sigb -all | # puppet cert sigb -all | ||
</ | </syntaxhighlight> | ||
..для подписи всех сразу: | ..для подписи всех сразу: | ||
< | <syntaxhighlight lang="bash"> | ||
# puppet cert sigb --all | # puppet cert sigb --all | ||
</ | </syntaxhighlight> | ||
Теперь мы имеем slave сервера (''agent1, agent2, agent3'') под управлением master сервера. | Теперь мы имеем slave сервера (''agent1, agent2, agent3'') под управлением master сервера. | ||
Для решения задачи нам понадобится puppetdb, для кеширования результатов запросов. Более подробно о настройках [[Puppetdb]] и [[PostgreSQL]]. | Для решения задачи нам понадобится puppetdb, для кеширования результатов запросов. Более подробно о настройках [[Puppetdb]] и [[PostgreSQL]]. | ||
Все настройки базы данных производятся только на master сервере. | Все настройки базы данных производятся только на master сервере. | ||
Инициализируем базу данных postgresql и запустим службу: | Инициализируем базу данных postgresql и запустим службу: | ||
< | <syntaxhighlight lang="bash"> | ||
# /etc/init.d/postgresql initdb | # /etc/init.d/postgresql initdb | ||
# systemctl start postgresql | # systemctl start postgresql | ||
</ | </syntaxhighlight> | ||
Создадим нового пользователя, базу данных и установим необходимый плагин: | Создадим нового пользователя, базу данных и установим необходимый плагин: | ||
< | <syntaxhighlight lang="bash"> | ||
# createuser -U postgres -DRSP puppetdb | # createuser -U postgres -DRSP puppetdb | ||
# createdb -U postgres -E UTF8 -O puppetdb puppetdb | # createdb -U postgres -E UTF8 -O puppetdb puppetdb | ||
# psql -U postgres puppetdb -c 'create extension pg_trgm' | # psql -U postgres puppetdb -c 'create extension pg_trgm' | ||
</ | </syntaxhighlight> | ||
Сделаем базу доступной по сети: | Сделаем базу доступной по сети: | ||
< | <syntaxhighlight lang="bash"> | ||
# echo "listen_addresses = 'localhost'" >> /var/lib/pgsql/data/postgresql.conf | # echo "listen_addresses = 'localhost'" >> /var/lib/pgsql/data/postgresql.conf | ||
# echo "host puppetdb puppetdb 127.0.0.1/32 md5" >> /var/lib/pgsql/data/pg_hba.conf | # echo "host puppetdb puppetdb 127.0.0.1/32 md5" >> /var/lib/pgsql/data/pg_hba.conf | ||
# systemctl restart postgresql | # systemctl restart postgresql | ||
</ | </syntaxhighlight> | ||
Важным условием корректной работы является синхронизация времени, как на master сервере, так и на агентах: | Важным условием корректной работы является синхронизация времени, как на master сервере, так и на агентах: | ||
< | <syntaxhighlight lang="bash"> | ||
# systemctl enable ntpd | # systemctl enable ntpd | ||
# systemctl start ntpd | # systemctl start ntpd | ||
</ | </syntaxhighlight> | ||
Для настройки PuppetDB необходимо отредактировать конфигурационные файлы {{path|/etc/puppetdb/conf.d/database.ini}} и {{path|/etc/puppetdb/conf.d/jetty.ini}} в соответствии с параметрами, которые были указаны при конфигурировании базы данных и инструкцией [[Puppetdb]]. | Для настройки PuppetDB необходимо отредактировать конфигурационные файлы {{path|/etc/puppetdb/conf.d/database.ini}} и {{path|/etc/puppetdb/conf.d/jetty.ini}} в соответствии с параметрами, которые были указаны при конфигурировании базы данных и инструкцией [[Puppetdb]]. | ||
После настройки PuppetDB, необходимо сообщить Puppet, что мы хотим кешировать результаты запросов. Добавим в конфигурационный файл, в секцию [master] {{path|/etc/puppet/puppet.conf}}, следующее, | После настройки PuppetDB, необходимо сообщить Puppet, что мы хотим кешировать результаты запросов. Добавим в конфигурационный файл, в секцию [master] {{path|/etc/puppet/puppet.conf}}, следующее, | ||
< | <syntaxhighlight lang="ini"> | ||
pluginsync = true | pluginsync = true | ||
storeconfigs = true | storeconfigs = true | ||
storeconfigs_backend = puppetdb | storeconfigs_backend = puppetdb | ||
reports = store,puppetdb | reports = store,puppetdb | ||
</ | </syntaxhighlight> | ||
..так же создадим {{path|/etc/puppet/routes.yaml}} и {{path|/etc/puppet/puppetdb.conf}} со следующим содержимым: | ..так же создадим {{path|/etc/puppet/routes.yaml}} и {{path|/etc/puppet/puppetdb.conf}} со следующим содержимым: | ||
файл {{path|/etc/puppet/routes.yaml}}: | |||
< | <syntaxhighlight lang="ini"> | ||
--- | --- | ||
master: | master: | ||
Строка 243: | Строка 297: | ||
terminus: puppetdb | terminus: puppetdb | ||
cache: yaml | cache: yaml | ||
</ | </syntaxhighlight> | ||
файл {{path|/etc/puppet/puppetdb.conf}}: | |||
< | <syntaxhighlight lang="ini"> | ||
[main] | [main] | ||
pluginsync = true | pluginsync = true | ||
Строка 251: | Строка 305: | ||
storeconfigs_backend = puppetdb | storeconfigs_backend = puppetdb | ||
reports = store,puppetdb | reports = store,puppetdb | ||
</ | </syntaxhighlight> | ||
Запустим PuppetDB и перезапустим puppet-сервисы: | Запустим PuppetDB и перезапустим puppet-сервисы: | ||
< | <syntaxhighlight lang="bash"> | ||
# systemctl start puppetdb | # systemctl start puppetdb | ||
# systemctl restart puppetmaster | # systemctl restart puppetmaster | ||
# systemctl restart puppet | # systemctl restart puppet | ||
</ | </syntaxhighlight> | ||
После того как настроены Puppet и PuppeDB, можно перейти к написанию манифеста для определения серийного номера агентов. | После того как настроены Puppet и PuppeDB, можно перейти к написанию манифеста для определения серийного номера агентов. | ||
Пример получения серийного номера машины: | Пример получения серийного номера машины: | ||
< | <syntaxhighlight lang="ini"> | ||
exec { 'serial': | exec { 'serial': | ||
command => 'dmidecode -t system | grep Serial' | command => 'dmidecode -t system | grep Serial' | ||
} | } | ||
</ | </syntaxhighlight> | ||
Так же можно указать агентов, на которых будет запускаться манифест: | Так же можно указать агентов, на которых будет запускаться манифест: | ||
< | <syntaxhighlight lang="ini"> | ||
node 'agent1', 'agent2', 'agent3' { | node 'agent1', 'agent2', 'agent3' { | ||
exec { 'serial': | exec { 'serial': | ||
Строка 274: | Строка 328: | ||
node default {} | node default {} | ||
</ | </syntaxhighlight> | ||
Агенты раз в 30 минут опрашивают сервер и выполняют адресованные им манифесты. Периодичность опросов можно изменить в манифесте. | Агенты раз в 30 минут опрашивают сервер и выполняют адресованные им манифесты. Периодичность опросов можно изменить в манифесте. | ||
Для принудительного запуска манифеста, необходимо выполнить на агенте: | Для принудительного запуска манифеста, необходимо выполнить на агенте: | ||
< | <syntaxhighlight lang="bash"> | ||
# puppet agent --test --debug | # puppet agent --test --debug | ||
</ | </syntaxhighlight> | ||
= Готовые манифесты = | == Готовые манифесты == | ||
== Прописывание репозитория == | === Прописывание репозитория === | ||
< | <syntaxhighlight lang="ruby">exec { 'repo-clean': | ||
command => '/usr/bin/apt-repo rm all', | command => '/usr/bin/apt-repo rm all', | ||
} | } | ||
Строка 296: | Строка 350: | ||
exec { 'repo-add-extra': | exec { 'repo-add-extra': | ||
command => '/usr/bin/apt-repo add "rpm http://10.10.3.77/repo/extra x86_64 extra"', | command => '/usr/bin/apt-repo add "rpm http://10.10.3.77/repo/extra x86_64 extra"', | ||
}</ | }</syntaxhighlight> | ||
== Обновление системы == | === Обновление системы === | ||
Для обновления системы каждый день в промежутке между 5-8 утра можно использовать следующий манифест: | Для обновления системы каждый день в промежутке между 5-8 утра можно использовать следующий манифест: | ||
< | <syntaxhighlight lang="ruby">schedule { 'update': | ||
range => '5 - 8', | range => '5 - 8', | ||
period => daily, | period => daily, | ||
Строка 314: | Строка 368: | ||
command => '/usr/bin/apt-get dist-upgrade -y', | command => '/usr/bin/apt-get dist-upgrade -y', | ||
schedule => 'update', | schedule => 'update', | ||
}</ | }</syntaxhighlight> | ||
= Советы = | == Советы == | ||
* Для {{cmd|command}} указывайте полный путь к выполняемому файлу; | * Для {{cmd|command}} указывайте полный путь к выполняемому файлу; | ||
Текущая версия от 02:21, 8 апреля 2023
Установка puppet agent и puppet server
Необходимо установить следующие пакеты:
# apt-get install puppet puppetserver java-11-openjdk
можно и более свежую версию java
Настройка puppet master
Прежде всего нужно настроить ваш dns сервер на резолва адресов. Для примера можно внести настройки в файл /etc/hosts:
127.0.0.1 localhost.localdomain localhost
10.10.3.107 puppetserver
10.10.3.5 puppetclient
После установки всех пакетов настройки dns, конфигурационные файлы puppet находятся в директории /etc/puppet/. Измените файл настройки /etc/puppet/puppet.conf так:
[main]
certname=puppetserver
server=puppetserver
[master]
certname=puppetserver
environment=production
Для создания файлов на агентах нужно отредактировать файл /etc/puppet/fileserver.conf:
[files]
path /etc/puppet/code/modules/files
allow *
- в секции main находятся глобальные настройки сервиса, а в секции master, находятся настройки сервера puppet;
- параметр server говорит клиенту, с каким сервером работать;
- параметр certname задает имя с которым клиент будет обращаться к серверу.
Запуск сервисов:
# systemctl enable --now puppet
# systemctl enable --now puppetserver
Для подписи всех сертификатов необходимо выполнить команду:
# puppetserver ca sign --all
Настройка агента puppet
Для примера на клиенте также был настроен файл /etc/hosts, как показано выше.
Файл настроек агента /etc/puppet/puppet.conf должен выглядеть следующим образом:
[agent]
server=puppetserver
Однако, вместо puppetserver вы можете подставить, при необходимости, имя вашего сервера.
Для проверки работы агента необходимо выполнить команду:
# puppet agent -t
Запуск puppet
Разрешаем самозапуск службы puppet, и перезапускаем её:
# systemctl enable puppet
# systemctl restart puppet
puppetd
- В соответствии с http://reductivelabs.com/trac/puppet/wiki/CertificatesAndSecurity при первом запуске puppetd клиента, необходимо обратиться к серверу с запросом подписания сертификата. Для этого puppetd должен быть запущен с ключом --waitforcert. Предлагаю исправить /etc/init.d/puppetd -- добавить режим sign, при котором puppetd стартует с этой опцией.
- Необходимо добавить в /etc/init.d/puppetd проверку на задание переменной PUPPET_SERVER, чтобы при старте происходило подключение к последнему. А то висит процесс, вроде всё работает, но на самом деле клиент ничего не делает -- не знает ip-сервера.
Создание манифестов и модулей puppet
Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в /etc/puppet:
code
modules
environments
manifests
Внесем корректировки в файл /etc/puppet/puppet.conf:
[master]
environment=production
Это добавляет окружение production в сервер.
В папке /etc/puppet/environments/production/manifests, необходимо создать файл site.pp со следующим содержимым:
file { "/etc/passwd":
owner => "root",
group => "bin",
mode => "644",
}
Все обновление манифестов происходят автоматически. На агентах опрос сервера на предмет новых манифестов составляет 30 минут.
Для ускорения обновления конфигурации на агенте используется команда:
# puppet agent -t --debug
Ключ --debug используется для наглядной демонстрации применения манифеста на агенте.
Проверка выполнения конкретного манифеста:
# puppet apply /etc/puppet/environments/production/manifests/site.pp
Notice: Compiled catalog for puppet in environment production in 0.02 seconds
Notice: /Stage[main]/Main/File[/etc/passwd]/group: group changed 'root' to 'bin'
Notice: Applied catalog in 0.03 seconds
Ещё пример манифеста (для установки apache2 используется ресурс exec apt-get):
exec { 'apt-update':
command => '/usr/bin/apt-get update'
}
package { 'tree':
ensure => installed,
}
package { 'apache2':
require => Exec['apt-update'],
ensure => installed,
}
file { '123':
ensure => file,
path => '/etc/123.txt',
source => 'puppet:///files/123.txt',
owner => 'root',
group => 'root',
mode => '0777',
}
Работа с сертификатами
По умолчанию при запуске после установки puppetserver выполняет функцию CA сервера, и генерирует сертификаты в каталоге /etc/puppet/ssl. В созданной цепочке сертификат CA - ca.pem является самоподписанным.
Если перед первым запуском puppetserver выполнить команду
puppetserver ca setup --certname puppetserver --subject-alt-names server.domain.org,server.newdomain.org где в --subject-alt-names опционально можно перечислить альтернативные имена хоста
будет создана цепочка с корневым сертификатом root_key.pem, которым и подпишется сертификат CA.
При использовании в вашей сети нескольких puppetserver, целесообразно создать подписанный сертификат для каждого из этих серверов и затем распространить сертификаты на соответствующие.
На остановленном puppetserver са и запустите команду
puppetserver ca generate --certname server2 --subject-alt-names server.domain.org,server.newdomain.org --ca-client где в --subject-alt-names опционально можно перечислить альтернативные имена хоста
Настройка puppet для работы с Foreman
Создание конфигурационного файла /etc/puppet/puppet.conf производится в процессе установки.
Пред первым запуском puppetserver необходимо закомментировать следующие строки в файле /etc/puppet/puppet.conf:
[master]
...
# external_nodes = /usr/lib/puppet-modules/theforeman-foreman/files/external_node_v2.rb
# node_terminus = exec
[master]
...
# external_nodes = /usr/lib/puppet-modules/puppetserver-foreman/files/enc.rb
# node_terminus = exec
Проверяем наличие файла /etc/puppet/autosign.conf и установленные на него разрешения:
# touch /etc/puppet/autosign.conf
# chmod 664 /etc/puppet/autosign.conf
Чтобы дать возможность обрабатывать запросы о окружении Puppet Server редактируем файл /etc/puppet/auth.conf:
path /puppet/v3/environment_classes
method find
allow *
Cоздаем файл /etc/puppet/foreman.yaml:
---
# Update for your Foreman and Puppet master hostname(s)
:url: "http://sample.server.name:2345"
:ssl_ca: "/etc/puppet/ssl/certs/ca.pem"
:ssl_cert: "/etc/puppet/ssl/certs/sample.server.name.pem"
:ssl_key: "/etc/puppet/ssl/private_keys/sample.server.name.pem"
# Advanced settings
#:puppetdir: "/opt/puppetlabs/server/data/puppetserver"
:puppetdir: "/var/lib/puppetserver"
:puppetuser: "puppet"
:facts: true
:timeout: 10
:threads: null
Разрешаем самозапуск служб puppetserver, puppet, и запускаем их:
# systemctl enable --now puppetserver
# systemctl enable --now puppet
Пример использования Puppet + PuppetDB для инвентаризация управляемых машин
Рассмотрим на примере. Допустим системный администратор имеет три slave сервера (10.0.1.1, 10.0.2.1, 10.0.3.1) и один master (10.1.0.1). Ему необходимо в автоматическом режиме узнать серийный номер каждой машины и закешировать результаты PuppetDB. Для этого первоначально необходимо настроить Puppet, как на сервере, так и на управляемых машинах (агентах).
Добавим в /etc/hosts (как на master машине так и на агентах) наши адреса:
10.1.0.1 master.example.com puppet
10.0.1.1 agent1.example.com
10.0.2.1 agent2.example.com
10.0.3.1 agent3.example.com
Установим необходимые пакеты на master сервере:
# apt-get install puppet puppet-server postgresql10-server postgresql10-contrib puppetdb-terminus
..и на агентах:
# apt-get install puppet
Сконфигурируем Puppet, изменив содержимое /etc/puppet/puppet.conf на следующее:
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/etc/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/facts.d
[master]
certname=puppet
dns_alt_names=puppet,master.example.com
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
Если Puppet уже присутствовал в системе то:
# rm -rf /etc/puppet/ssl
SSL сертификаты Puppet сгенерирует самостоятельно при запуске:
# systemctl start puppetmaster
# systemctl start puppet
Настроим агенты, указав адрес master сервера в /etc/puppet/puppet.conf:
[agent]
server=master.example.com
После чего можно сгенерировать сертификаты на агентах:
# rm -rf /etc/puppet/ssl/
# puppet agent -t
После того, как сертификаты будут готовы, их можно проверить в очереди на подпись на master сервере:
# puppet cert sigb -all
..для подписи всех сразу:
# puppet cert sigb --all
Теперь мы имеем slave сервера (agent1, agent2, agent3) под управлением master сервера.
Для решения задачи нам понадобится puppetdb, для кеширования результатов запросов. Более подробно о настройках Puppetdb и PostgreSQL. Все настройки базы данных производятся только на master сервере.
Инициализируем базу данных postgresql и запустим службу:
# /etc/init.d/postgresql initdb
# systemctl start postgresql
Создадим нового пользователя, базу данных и установим необходимый плагин:
# createuser -U postgres -DRSP puppetdb
# createdb -U postgres -E UTF8 -O puppetdb puppetdb
# psql -U postgres puppetdb -c 'create extension pg_trgm'
Сделаем базу доступной по сети:
# echo "listen_addresses = 'localhost'" >> /var/lib/pgsql/data/postgresql.conf
# echo "host puppetdb puppetdb 127.0.0.1/32 md5" >> /var/lib/pgsql/data/pg_hba.conf
# systemctl restart postgresql
Важным условием корректной работы является синхронизация времени, как на master сервере, так и на агентах:
# systemctl enable ntpd
# systemctl start ntpd
Для настройки PuppetDB необходимо отредактировать конфигурационные файлы /etc/puppetdb/conf.d/database.ini и /etc/puppetdb/conf.d/jetty.ini в соответствии с параметрами, которые были указаны при конфигурировании базы данных и инструкцией Puppetdb.
После настройки PuppetDB, необходимо сообщить Puppet, что мы хотим кешировать результаты запросов. Добавим в конфигурационный файл, в секцию [master] /etc/puppet/puppet.conf, следующее,
pluginsync = true
storeconfigs = true
storeconfigs_backend = puppetdb
reports = store,puppetdb
..так же создадим /etc/puppet/routes.yaml и /etc/puppet/puppetdb.conf со следующим содержимым:
файл /etc/puppet/routes.yaml:
---
master:
facts:
terminus: puppetdb
cache: yaml
файл /etc/puppet/puppetdb.conf:
[main]
pluginsync = true
storeconfigs = true
storeconfigs_backend = puppetdb
reports = store,puppetdb
Запустим PuppetDB и перезапустим puppet-сервисы:
# systemctl start puppetdb
# systemctl restart puppetmaster
# systemctl restart puppet
После того как настроены Puppet и PuppeDB, можно перейти к написанию манифеста для определения серийного номера агентов. Пример получения серийного номера машины:
exec { 'serial':
command => 'dmidecode -t system | grep Serial'
}
Так же можно указать агентов, на которых будет запускаться манифест:
node 'agent1', 'agent2', 'agent3' {
exec { 'serial':
command => 'dmidecode -t system | grep Serial'
}
}
node default {}
Агенты раз в 30 минут опрашивают сервер и выполняют адресованные им манифесты. Периодичность опросов можно изменить в манифесте. Для принудительного запуска манифеста, необходимо выполнить на агенте:
# puppet agent --test --debug
Готовые манифесты
Прописывание репозитория
exec { 'repo-clean':
command => '/usr/bin/apt-repo rm all',
}
exec { 'repo-add-p8':
command => '/usr/bin/apt-repo add http://10.10.3.77/repo/p8',
}
exec { 'repo-add-p8-arepo':
command => '/usr/bin/apt-repo add "rpm http://10.10.3.77/repo/p8 x86_64-i586 classic"',
}
exec { 'repo-add-extra':
command => '/usr/bin/apt-repo add "rpm http://10.10.3.77/repo/extra x86_64 extra"',
}
Обновление системы
Для обновления системы каждый день в промежутке между 5-8 утра можно использовать следующий манифест:
schedule { 'update':
range => '5 - 8',
period => daily,
repeat => 1,
}
exec { 'apt-update':
command => '/usr/bin/apt-get update',
}
exec { 'apt-distupgrade':
require => Exec['apt-update'],
command => '/usr/bin/apt-get dist-upgrade -y',
schedule => 'update',
}
Советы
- Для command указывайте полный путь к выполняемому файлу;