Puppet: различия между версиями

Материал из ALT Linux Wiki
(заметаем ненужное)
м (source tags deprecated)
Строка 1: Строка 1:
{{stub}}
{{stub}}


==== Установка puppet agent и puppet server ====
== Установка puppet agent и puppet server ==


Необходимо установить следующие пакеты:
Необходимо установить следующие пакеты:
<pre># apt-get install puppet puppetserver</pre>
<syntaxhighlight lang="bash"># apt-get install puppet puppetserver</syntaxhighlight>


==== Настройка puppet master ====
== Настройка puppet master ==
Прежде всего нужно настроить ваш dns сервер на резолва адресов.  
Прежде всего нужно настроить ваш dns сервер на резолва адресов.  
Для примера можно внести настройки в файл {{path|/etc/hosts}}:
Для примера можно внести настройки в файл {{path|/etc/hosts}}:
<pre>127.0.0.1      localhost.localdomain localhost
<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</pre>
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}} так:
<pre>
<syntaxhighlight lang="ini">
[main]
[main]
certname=puppetserver
certname=puppetserver
Строка 20: Строка 21:
[master]
[master]
certname=puppetserver
certname=puppetserver
environment=production</pre>
environment=production</syntaxhighlight>


Для создания файлов на агентах нужно отредактировать файл /etc/puppet/fileserver.conf
Для создания файлов на агентах нужно отредактировать файл {{path|/etc/puppet/fileserver.conf}}:
<pre>[files]
<syntaxhighlight lang="ini">[files]
path /etc/puppet/code/modules/files
path /etc/puppet/code/modules/files
allow *</pre>
allow *</syntaxhighlight>
 
* в секции '''main''' находятся глобальные настройки сервиса, а в секции '''master''', находятся настройки сервера puppet;
* параметр '''server''' говорит клиенту, с каким сервером работать;
* параметр '''certname''' задает имя с которым клиент будет обращаться к серверу.
 
Запуск сервисов:
 
<syntaxhighlight lang="bash">
# systemctl enable  --now puppet
# systemctl enable --now puppetserver</syntaxhighlight>
 
Для подписи всех сертификатов необходимо выполнить команду:


В секции '''main''' находятся глобальные настройки сервиса, а в секции '''master''', находятся настройки сервера puppet.<br>
<syntaxhighlight lang="bash"># puppetserver ca sign --all </syntaxhighlight>
Параметр '''server''' говорит клиенту, с каким сервером работать.
Параметр '''certname''' задает имя с которым клиент будет ображаться к серверу.
Запуск сервисов:<br>
<pre># systemctl start puppet
# systemctl start puppetserver
# systemctl enable puppet
# systemctl enable puppetserver </pre>


Для подписи всех сертификатов необходимо выполнить команду:<br>
== Настройка агента puppet ==
<pre># puppetserver ca sign --all </pre>
Для примера на клиенте также был настроен файл {{path|/etc/hosts}}, как показано выше.


==== Настройка агента puppet ====
Для примера так же на клиенте был настроен файл {{path|/etc/hosts}}, как показано выше.<br>
Файл настроек агента {{path|/etc/puppet/puppet.conf}} должен выглядеть следующим образом:<br>
Файл настроек агента {{path|/etc/puppet/puppet.conf}} должен выглядеть следующим образом:<br>
<pre>[agent]
<syntaxhighlight lang="ini">[agent]
server=puppetserver</pre>
server=puppetserver</syntaxhighlight>


Однако, вместо ''puppetserver'' вы можете подставить, при необходимости, имя вашего сервера.
Однако, вместо ''puppetserver'' вы можете подставить, при необходимости, имя вашего сервера.


Для проверки работы агента необходимо выполнить команду:<br>
Для проверки работы агента необходимо выполнить команду:
<pre># puppet agent -t</pre>


==== Запуск puppet ====
<syntaxhighlight lang="bash"># puppet agent -t</syntaxhighlight>
 
== Запуск puppet ==


Разрешаем самозапуск службы puppet, и перезапускаем её:
Разрешаем самозапуск службы puppet, и перезапускаем её:
 
<syntaxhighlight lang="bash">
# systemctl enable puppet
# systemctl enable puppet
# systemctl restart puppet
# systemctl restart puppet
 
</syntaxhighlight>
==== puppetd ====
== 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 ==
Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в {{path|/etc/puppet}}:
Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в {{path|/etc/puppet}}:
<pre>code
<syntaxhighlight lang="ini">code
modules
modules
environments
environments
manifests</pre>
manifests</syntaxhighlight>


Внесем корректировки в файл {{path|/etc/puppet/puppet.conf}}:
Внесем корректировки в файл {{path|/etc/puppet/puppet.conf}}:
<pre>[master]
<syntaxhighlight lang="ini">[master]
environment=production</pre>
environment=production</syntaxhighlight>
Это добавляет окружение '''production''' в сервер.
Это добавляет окружение '''production''' в сервер.


{{Attention|puppetmaster берёт информацию о манифестах с {{path|/etc/puppet/environments/production/manifests}}.}}
{{Attention|puppetmaster берёт информацию о манифестах из {{path|/etc/puppet/environments/production/manifests}}.}}


В папке {{path|/etc/puppet/environments/production/manifests}},необходимо создать файл {{path|site.pp}}<br>
В папке {{path|/etc/puppet/environments/production/manifests}}, необходимо создать файл {{path|site.pp}} со следующим содержимым:
Содержание файла:
<syntaxhighlight lang="ini">file { "/etc/passwd":
<source lang="ruby">file { "/etc/passwd":
owner => "root",
owner => "root",
group => "bin",
group => "bin",
mode => "644",
mode => "644",
}</source>
}</syntaxhighlight>
Все обновление манифестов происходят автоматически. На агентах опрос сервера на предмет новых манифестов составляет 30 минут. <br>
Все обновление манифестов происходят автоматически. На агентах опрос сервера на предмет новых манифестов составляет 30 минут.
Для ускорения обновления конфигурации на агенте используется команда:<br>


# puppet agent -t --debug
Для ускорения обновления конфигурации на агенте используется команда:
 
<syntaxhighlight lang="bash"># puppet agent -t --debug</syntaxhighlight>


Ключ --debug используется для наглядной демонстрации применения манифеста на агенте.
Ключ --debug используется для наглядной демонстрации применения манифеста на агенте.


Проверка выполнения конкретного манифеста:
Проверка выполнения конкретного манифеста:
<source lang="text" highlight="1"># puppet apply /etc/puppet/environments/production/manifests/site.pp
<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</source>
Notice: Applied catalog in 0.03 seconds</syntaxhighlight>


Ещё пример манифеста (для установки apache2 используется ресурс exec apt-get):
Ещё пример манифеста (для установки apache2 используется ресурс exec apt-get):
<source>exec { 'apt-update':
<syntaxhighlight lang="ini">exec { 'apt-update':
  command => '/usr/bin/apt-get update'
  command => '/usr/bin/apt-get update'
}
}
Строка 113: Строка 119:
  group => 'root',
  group => 'root',
  mode => '0777',
  mode => '0777',
}</source>
}</syntaxhighlight>


==== Работа с сертификатами ====
== Работа с сертификатами ==


По умолчанию при запуске после установки '''puppetserver''' выполняет функцию CA сервера, и генерирует сертификаты в каталоге ''/etc/puppet/ssl''.
По умолчанию при запуске после установки '''puppetserver''' выполняет функцию CA сервера, и генерирует сертификаты в каталоге ''/etc/puppet/ssl''.
Строка 135: Строка 141:
{{Attention|Включить/отключить функцию '''рuppetserver ca''' можно в файле ''/etc/puppetserver/services.d/ca.cfg''.}}
{{Attention|Включить/отключить функцию '''рuppetserver ca''' можно в файле ''/etc/puppetserver/services.d/ca.cfg''.}}


==== Настройка puppet для работы с Foreman ====
== Настройка puppet для работы с Foreman ==


Создание конфигурационного файла ''/etc/puppet/puppet.conf'' производится в процессе установки.
Создание конфигурационного файла {{path|/etc/puppet/puppet.conf}} производится в процессе установки.


Пред первым запуском puppetserver необходимо закомментировать следующие строки в файле ''/etc/puppet/puppet.conf''
Пред первым запуском puppetserver необходимо закомментировать следующие строки в файле {{path|/etc/puppet/puppet.conf}}:
<pre>[master]
<syntaxhighlight lang="ini">[master]
   ...
   ...
#  external_nodes = /usr/lib/puppet-modules/theforeman-foreman/files/external_node_v2.rb
#  external_nodes = /usr/lib/puppet-modules/theforeman-foreman/files/external_node_v2.rb
#  node_terminus = exec
#  node_terminus = exec
</pre>
</syntaxhighlight>
{{Attention|Если в системе установлен пакет '''puppet-puppetserver-foreman''', необходимо закомментировать строки  
{{Attention|Если в системе установлен пакет '''puppet-puppetserver-foreman''', необходимо закомментировать строки  
<pre>[master]
<syntaxhighlight lang="ini">[master]
   ...
   ...
#  external_nodes = /usr/lib/puppet-modules/puppetserver-foreman/files/enc.rb
#  external_nodes = /usr/lib/puppet-modules/puppetserver-foreman/files/enc.rb
#  node_terminus = exec
#  node_terminus = exec
</pre>}}
</syntaxhighlight>}}
Проверяем наличие файла ''/etc/puppet/autosign.conf'' и установленные на него разрешения
Проверяем наличие файла {{path|/etc/puppet/autosign.conf}} и установленные на него разрешения:
touch /etc/puppet/autosign.conf
<syntaxhighlight lang="bash">
chmod 664 /etc/puppet/autosign.conf
# touch /etc/puppet/autosign.conf
# chmod 664 /etc/puppet/autosign.conf
</syntaxhighlight>


{{Attention|Раскомментировать строки выше потребуется после установки и запуска сервиса '''Foreman''' и к нему подключен(-ы) '''Smart_Proxy''' }}
{{Attention|Раскомментировать строки выше потребуется после установки и запуска сервиса '''Foreman''' и к нему подключен(-ы) '''Smart_Proxy''' }}
Чтобы дать возможность обрабатывать запросы о окружении Puppet Server редактируем файл ''/etc/puppet/auth.conf'':
Чтобы дать возможность обрабатывать запросы о окружении Puppet Server редактируем файл {{path|/etc/puppet/auth.conf}}:
<pre>path /puppet/v3/environment_classes
<syntaxhighlight lang="ini">path /puppet/v3/environment_classes
method find
method find
allow *
allow *
</pre>  
</syntaxhighlight>  
Cоздаем файл ''/etc/puppet/foreman.yaml''
Cоздаем файл {{path|/etc/puppet/foreman.yaml}}:
<pre>---
<syntaxhighlight lang="ini">---
# Update for your Foreman and Puppet master hostname(s)
# Update for your Foreman and Puppet master hostname(s)
:url: <nowiki>"http://sample.server.name:2345"</nowiki>
:url: <nowiki>"http://sample.server.name:2345"</nowiki>
Строка 175: Строка 183:
:timeout: 10
:timeout: 10
:threads: null
:threads: null
</pre>
</syntaxhighlight>
Разрешаем самозапуск служб puppetserver, puppet, и запускаем их:
Разрешаем самозапуск служб puppetserver, puppet, и запускаем их:
<pre>systemctl enable puppetserver puppet
<syntaxhighlight lang="bash">
systemctl start puppetserver
# systemctl enable --now puppetserver
systemctl start puppet
# systemctl enable --now puppet
</pre>
</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 машине так и на агентах) наши адреса:
<source lang="bash">
<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
</source>
</syntaxhighlight>
Установим необходимые пакеты на master сервере,
Установим необходимые пакеты на master сервере:
<source lang="bash">
<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
</source>
</syntaxhighlight>
..и на агентах:
..и на агентах:
<source lang="bash">
<syntaxhighlight lang="bash">
# apt-get install puppet
# apt-get install puppet
</source>
</syntaxhighlight>
Сконфигурируем Puppet, изменив содержимое {{path|/etc/puppet/puppet.conf}} на следующее:
Сконфигурируем Puppet, изменив содержимое {{path|/etc/puppet/puppet.conf}} на следующее:
<source lang="bash">
<syntaxhighlight lang="ini">
[main]
[main]
logdir=/var/log/puppet
logdir=/var/log/puppet
Строка 213: Строка 222:
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
</source>
</syntaxhighlight>
Если Puppet уже присутствовал в систме то:
Если Puppet уже присутствовал в системе то:
<source lang="bash">
<syntaxhighlight lang="bash">
# rm -rf /etc/puppet/ssl
# rm -rf /etc/puppet/ssl
</source>
</syntaxhighlight>
SSL сертификаты Puppet сгенерирует самостоятельно при запуске:
SSL сертификаты Puppet сгенерирует самостоятельно при запуске:
<source lang="bash">
<syntaxhighlight lang="bash">
# systemctl start puppetmaster
# systemctl start puppetmaster
# systemctl start puppet
# systemctl start puppet
</source>
</syntaxhighlight>
Настроим агенты, указав адрес master сервера в {{path|/etc/puppet/puppet.conf}}:
Настроим агенты, указав адрес master сервера в {{path|/etc/puppet/puppet.conf}}:
<source lang="bash">
<syntaxhighlight lang="ini">
[agent]
[agent]
server=master.example.com
server=master.example.com
</source>
</syntaxhighlight>
После чего можно сгенерировать сертификаты на агентах:
После чего можно сгенерировать сертификаты на агентах:
<source lang="bash">
<syntaxhighlight lang="bash">
# rm -rf /etc/puppet/ssl/
# rm -rf /etc/puppet/ssl/
# puppet agent -t
# puppet agent -t
</source>
</syntaxhighlight>
После того, как сертификаты будут готовы, их можно проверить в очереди на подпись на master сервере,
После того, как сертификаты будут готовы, их можно проверить в очереди на подпись на master сервере:
<source lang="bash">
<syntaxhighlight lang="bash">
# puppet cert sigb -all
# puppet cert sigb -all
</source>
</syntaxhighlight>
..для подписи всех сразу:
..для подписи всех сразу:
<source lang="bash">
<syntaxhighlight lang="bash">
# puppet cert sigb --all
# puppet cert sigb --all
</source>
</syntaxhighlight>
Теперь мы имеем slave сервера (''agent1, agent2, agent3'') под управлением master сервера.
Теперь мы имеем slave сервера (''agent1, agent2, agent3'') под управлением master сервера.
Для решения задачи нам понадобится puppetdb, для кеширования результатов запросов. Более подробно о настройках [[Puppetdb]] и [[PostgreSQL]].
Для решения задачи нам понадобится puppetdb, для кеширования результатов запросов. Более подробно о настройках [[Puppetdb]] и [[PostgreSQL]].
Все настройки базы данных производятся только на master сервере.
Все настройки базы данных производятся только на master сервере.
Инициализируем базу данных postgresql и запустим службу:
Инициализируем базу данных postgresql и запустим службу:
<source lang="bash">
<syntaxhighlight lang="bash">
# /etc/init.d/postgresql initdb
# /etc/init.d/postgresql initdb
# systemctl start postgresql
# systemctl start postgresql
</source>
</syntaxhighlight>
Создадим нового пользователя, базу данных и установим необходимый плагин:
Создадим нового пользователя, базу данных и установим необходимый плагин:
<source lang="bash">
<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'
</source>
</syntaxhighlight>
Сделаем базу доступной по сети:
Сделаем базу доступной по сети:
<source lang="bash">
<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
</source>
</syntaxhighlight>
Важным условием корректной работы является синхронизация времени, как на master сервере, так и на агентах:
Важным условием корректной работы является синхронизация времени, как на master сервере, так и на агентах:
<source lang="bash">
<syntaxhighlight lang="bash">
# systemctl enable ntpd
# systemctl enable ntpd
# systemctl start ntpd
# systemctl start ntpd
</source>
</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}}, следующее,
<source lang="bash">
<syntaxhighlight lang="ini">
pluginsync = true
pluginsync = true
storeconfigs = true
storeconfigs = true
storeconfigs_backend = puppetdb
storeconfigs_backend = puppetdb
reports = store,puppetdb
reports = store,puppetdb
</source>
</syntaxhighlight>
..так же создадим {{path|/etc/puppet/routes.yaml}} и {{path|/etc/puppet/puppetdb.conf}} со следующим содержимым:
..так же создадим {{path|/etc/puppet/routes.yaml}} и {{path|/etc/puppet/puppetdb.conf}} со следующим содержимым:


''/etc/puppet/routes.yaml''
файл {{path|/etc/puppet/routes.yaml}}:
<source lang="bash">
<syntaxhighlight lang="ini">
---
---
master:
master:
Строка 283: Строка 295:
     terminus: puppetdb
     terminus: puppetdb
     cache: yaml
     cache: yaml
</source>
</syntaxhighlight>
''/etc/puppet/puppetdb.conf''
файл {{path|/etc/puppet/puppetdb.conf}}:
<source lang="bash">
<syntaxhighlight lang="ini">
[main]
[main]
pluginsync = true
pluginsync = true
Строка 291: Строка 303:
storeconfigs_backend = puppetdb
storeconfigs_backend = puppetdb
reports = store,puppetdb
reports = store,puppetdb
</source>
</syntaxhighlight>
Запустим PuppetDB и перезапустим puppet-сервисы:
Запустим PuppetDB и перезапустим puppet-сервисы:
<source lang="bash">
<syntaxhighlight lang="bash">
# systemctl start puppetdb
# systemctl start puppetdb
# systemctl restart puppetmaster
# systemctl restart puppetmaster
# systemctl restart puppet
# systemctl restart puppet
</source>
</syntaxhighlight>
После того как настроены Puppet и PuppeDB, можно перейти к написанию манифеста для определения серийного номера агентов.
После того как настроены Puppet и PuppeDB, можно перейти к написанию манифеста для определения серийного номера агентов.
Пример получения серийного номера машины:
Пример получения серийного номера машины:
<source lang="bash">
<syntaxhighlight lang="ini">
exec { 'serial':
exec { 'serial':
command => 'dmidecode -t system | grep Serial'
command => 'dmidecode -t system | grep Serial'
}
}
</source>
</syntaxhighlight>
Так же можно указать агентов, на которых будет запускаться манифест:
Так же можно указать агентов, на которых будет запускаться манифест:
<source lang="bash">
<syntaxhighlight lang="ini">
node 'agent1', 'agent2', 'agent3' {
node 'agent1', 'agent2', 'agent3' {
exec { 'serial':
exec { 'serial':
Строка 314: Строка 326:


node default {}
node default {}
</source>
</syntaxhighlight>
Агенты раз в 30 минут опрашивают сервер и выполняют адресованные им манифесты. Периодичность опросов можно изменить в манифесте.
Агенты раз в 30 минут опрашивают сервер и выполняют адресованные им манифесты. Периодичность опросов можно изменить в манифесте.
Для принудительного запуска манифеста, необходимо выполнить на агенте:
Для принудительного запуска манифеста, необходимо выполнить на агенте:
<source lang="bash">
<syntaxhighlight lang="bash">
# puppet agent --test --debug
# puppet agent --test --debug
</source>
</syntaxhighlight>


= Готовые манифесты =
== Готовые манифесты ==


== Прописывание репозитория ==
=== Прописывание репозитория ===


<source lang="ruby">exec { 'repo-clean':
<syntaxhighlight lang="ruby">exec { 'repo-clean':
     command => '/usr/bin/apt-repo rm all',
     command => '/usr/bin/apt-repo rm all',
}
}
Строка 336: Строка 348:
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"',
}</source>
}</syntaxhighlight>


== Обновление системы ==
=== Обновление системы ===


Для обновления системы каждый день в промежутке между 5-8 утра можно использовать следующий манифест:
Для обновления системы каждый день в промежутке между 5-8 утра можно использовать следующий манифест:


<source lang="ruby">schedule { 'update':
<syntaxhighlight lang="ruby">schedule { 'update':
     range  => '5 - 8',
     range  => '5 - 8',
     period => daily,
     period => daily,
Строка 354: Строка 366:
     command => '/usr/bin/apt-get dist-upgrade -y',
     command => '/usr/bin/apt-get dist-upgrade -y',
     schedule => 'update',
     schedule => 'update',
}</source>
}</syntaxhighlight>


= Советы =
== Советы ==
* Для {{cmd|command}} указывайте полный путь к выполняемому файлу;
* Для {{cmd|command}} указывайте полный путь к выполняемому файлу;



Версия от 12:39, 10 ноября 2022

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Установка puppet agent и puppet server

Необходимо установить следующие пакеты:

# apt-get install puppet puppetserver

Настройка 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

TODO:
  • В соответствии с 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 в сервер.

Внимание! puppetmaster берёт информацию о манифестах из /etc/puppet/environments/production/manifests.


В папке /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 опционально можно перечислить альтернативные имена хоста
Внимание! Включить/отключить функцию рuppetserver ca можно в файле /etc/puppetserver/services.d/ca.cfg.


Настройка 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
Внимание! Если в системе установлен пакет puppet-puppetserver-foreman, необходимо закомментировать строки
[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
Внимание! Раскомментировать строки выше потребуется после установки и запуска сервиса Foreman и к нему подключен(-ы) Smart_Proxy

Чтобы дать возможность обрабатывать запросы о окружении 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: <nowiki>"http://sample.server.name:2345"</nowiki>
: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 указывайте полный путь к выполняемому файлу;