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

Материал из ALT Linux Wiki
Нет описания правки
 
(не показано 56 промежуточных версий 12 участников)
Строка 1: Строка 1:
{{stub}}
{{stub}}


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


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


'''TODO'''
== Настройка puppet master ==
* В соответсвии с http://reductivelabs.com/trac/puppet/wiki/CertificatesAndSecurity при первом запуске puppetd клиента, необходимо обратиться к серверу с запросом подписания сертификата. Для этого puppetd должен быть запущен с ключом <tt>--waitforcert</tt>. Предлагаю исправить /etc/init.d/puppetd -- добавить режим sign, при котором puppetd стартует с  этой опцией.  
Прежде всего нужно настроить ваш dns сервер на резолва адресов.
* Необходимо добавить в /etc/init.d/puppetd проверку на задание переменной PUPPET_SERVER, чтобы при старте происходило подключение к последнему. А то висит процесс, вроде всё работает, но на самом деле клиент ничего не делает -- не знает ip-сервера.
Для примера можно внести настройки в файл {{path|/etc/hosts}}:
[[Category: puppet]]
<syntaxhighlight lang="ini">
127.0.0.1      localhost.localdomain localhost
10.10.3.107    puppetserver
10.10.3.5      puppetclient</syntaxhighlight>
После установки всех пакетов настройки dns, конфигурационные файлы puppet находятся в директории  {{path|/etc/puppet/}}. Измените файл настройки {{path|/etc/puppet/puppet.conf}} так:
<syntaxhighlight lang="ini">
[main]
certname=puppetserver
server=puppetserver
 
[master]
certname=puppetserver
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>
<syntaxhighlight lang="ini">[agent]
server=puppetserver</syntaxhighlight>
 
Однако, вместо ''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 стартует с  этой опцией.  
* Необходимо добавить в /etc/init.d/puppetd проверку на задание переменной PUPPET_SERVER, чтобы при старте происходило подключение к последнему. А то висит процесс, вроде всё работает, но на самом деле клиент ничего не делает -- не знает ip-сервера.}}
 
== Создание манифестов и модулей puppet ==
Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в {{path|/etc/puppet}}:
<syntaxhighlight lang="ini">code
modules
environments
manifests</syntaxhighlight>
 
Внесем корректировки в файл {{path|/etc/puppet/puppet.conf}}:
<syntaxhighlight lang="ini">[master]
environment=production</syntaxhighlight>
Это добавляет окружение '''production''' в сервер.
 
{{Attention|puppetmaster берёт информацию о манифестах из {{path|/etc/puppet/environments/production/manifests}}.}}
 
В папке {{path|/etc/puppet/environments/production/manifests}}, необходимо создать файл {{path|site.pp}} со следующим содержимым:
<syntaxhighlight lang="ini">file { "/etc/passwd":
owner => "root",
group => "bin",
mode => "644",
}</syntaxhighlight>
Все обновление манифестов происходят автоматически. На агентах опрос сервера на предмет новых манифестов составляет 30 минут.
 
Для ускорения обновления конфигурации на агенте используется команда:
 
<syntaxhighlight lang="bash"># puppet agent -t --debug</syntaxhighlight>
 
Ключ --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: /Stage[main]/Main/File[/etc/passwd]/group: group changed 'root' to 'bin'
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''.
В созданной цепочке сертификат CA - '''ca.pem''' является самоподписанным.
 
Если перед первым запуском '''puppetserver''' выполнить команду
<pre>puppetserver ca setup --certname puppetserver --subject-alt-names server.domain.org,server.newdomain.org
    где в --subject-alt-names опционально можно перечислить альтернативные имена хоста
</pre>
будет создана цепочка с корневым сертификатом '''root_key.pem''', которым и подпишется сертификат CA.
 
При использовании в вашей сети нескольких  '''puppetserver''', целесообразно создать подписанный сертификат для каждого из этих серверов и затем распространить сертификаты на соответствующие.
 
На остановленном '''puppetserver са''' и запустите команду
<pre>
puppetserver ca generate --certname server2 --subject-alt-names server.domain.org,server.newdomain.org --ca-client
    где в --subject-alt-names опционально можно перечислить альтернативные имена хоста
</pre>
{{Attention|Включить/отключить функцию '''рuppetserver ca''' можно в файле ''/etc/puppetserver/services.d/ca.cfg''.}}
 
== Настройка puppet для работы с Foreman ==
 
Создание конфигурационного файла {{path|/etc/puppet/puppet.conf}} производится в процессе установки.
 
Пред первым запуском puppetserver необходимо закомментировать следующие строки в файле {{path|/etc/puppet/puppet.conf}}:
<syntaxhighlight lang="ini">[master]
  ...
#  external_nodes = /usr/lib/puppet-modules/theforeman-foreman/files/external_node_v2.rb
#  node_terminus = exec
</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
allow *
</syntaxhighlight>
Cоздаем файл {{path|/etc/puppet/foreman.yaml}}:
<syntaxhighlight lang="ini">---
# 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
</syntaxhighlight>
Разрешаем самозапуск служб puppetserver, puppet, и запускаем их:
<syntaxhighlight lang="bash">
# systemctl enable --now puppetserver
# systemctl enable --now puppet
</syntaxhighlight>
 
== Пример использования Puppet + PuppetDB для инвентаризация управляемых машин ==
Рассмотрим на примере. Допустим системный администратор имеет три slave сервера (''10.0.1.1, 10.0.2.1, 10.0.3.1'') и один master (''10.1.0.1''). Ему необходимо в автоматическом режиме узнать серийный номер каждой машины и закешировать результаты PuppetDB. Для этого первоначально необходимо настроить Puppet, как на сервере, так и на управляемых машинах (агентах).
 
Добавим в {{path|/etc/hosts}} (как на master машине так и на агентах) наши адреса:
<syntaxhighlight lang="ini">
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
</syntaxhighlight>
Установим необходимые пакеты на master сервере:
<syntaxhighlight lang="bash">
# apt-get install puppet puppet-server postgresql10-server postgresql10-contrib puppetdb-terminus
</syntaxhighlight>
..и на агентах:
<syntaxhighlight lang="bash">
# apt-get install puppet
</syntaxhighlight>
Сконфигурируем Puppet, изменив содержимое {{path|/etc/puppet/puppet.conf}} на следующее:
<syntaxhighlight lang="ini">
[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
</syntaxhighlight>
Если Puppet уже присутствовал в системе то:
<syntaxhighlight lang="bash">
# rm -rf /etc/puppet/ssl
</syntaxhighlight>
SSL сертификаты Puppet сгенерирует самостоятельно при запуске:
<syntaxhighlight lang="bash">
# systemctl start puppetmaster
# systemctl start puppet
</syntaxhighlight>
Настроим агенты, указав адрес master сервера в {{path|/etc/puppet/puppet.conf}}:
<syntaxhighlight lang="ini">
[agent]
server=master.example.com
</syntaxhighlight>
После чего можно сгенерировать сертификаты на агентах:
<syntaxhighlight lang="bash">
# rm -rf /etc/puppet/ssl/
# puppet agent -t
</syntaxhighlight>
После того, как сертификаты будут готовы, их можно проверить в очереди на подпись на master сервере:
<syntaxhighlight lang="bash">
# puppet cert sigb -all
</syntaxhighlight>
..для подписи всех сразу:
<syntaxhighlight lang="bash">
# puppet cert sigb --all
</syntaxhighlight>
Теперь мы имеем slave сервера (''agent1, agent2, agent3'') под управлением master сервера.
 
Для решения задачи нам понадобится puppetdb, для кеширования результатов запросов. Более подробно о настройках [[Puppetdb]] и [[PostgreSQL]].
Все настройки базы данных производятся только на master сервере.
 
Инициализируем базу данных postgresql и запустим службу:
<syntaxhighlight lang="bash">
# /etc/init.d/postgresql initdb
# systemctl start postgresql
</syntaxhighlight>
Создадим нового пользователя, базу данных и установим необходимый плагин:
<syntaxhighlight lang="bash">
# createuser -U postgres -DRSP puppetdb
# createdb -U postgres -E UTF8 -O puppetdb puppetdb
# psql -U postgres puppetdb -c 'create extension pg_trgm'
</syntaxhighlight>
Сделаем базу доступной по сети:
<syntaxhighlight lang="bash">
# 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
</syntaxhighlight>
Важным условием корректной работы является синхронизация времени, как на master сервере, так и на агентах:
<syntaxhighlight lang="bash">
# systemctl enable ntpd
# systemctl start ntpd
</syntaxhighlight>
Для настройки PuppetDB необходимо отредактировать конфигурационные файлы {{path|/etc/puppetdb/conf.d/database.ini}} и {{path|/etc/puppetdb/conf.d/jetty.ini}} в соответствии с параметрами, которые были указаны при конфигурировании базы данных и инструкцией [[Puppetdb]].
 
После настройки PuppetDB, необходимо сообщить Puppet, что мы хотим кешировать результаты запросов. Добавим в конфигурационный файл, в секцию [master] {{path|/etc/puppet/puppet.conf}}, следующее,
<syntaxhighlight lang="ini">
pluginsync = true
storeconfigs = true
storeconfigs_backend = puppetdb
reports = store,puppetdb
</syntaxhighlight>
..так же создадим {{path|/etc/puppet/routes.yaml}} и {{path|/etc/puppet/puppetdb.conf}} со следующим содержимым:
 
файл {{path|/etc/puppet/routes.yaml}}:
<syntaxhighlight lang="ini">
---
master:
  facts:
    terminus: puppetdb
    cache: yaml
</syntaxhighlight>
файл {{path|/etc/puppet/puppetdb.conf}}:
<syntaxhighlight lang="ini">
[main]
pluginsync = true
storeconfigs = true
storeconfigs_backend = puppetdb
reports = store,puppetdb
</syntaxhighlight>
Запустим PuppetDB и перезапустим puppet-сервисы:
<syntaxhighlight lang="bash">
# systemctl start puppetdb
# systemctl restart puppetmaster
# systemctl restart puppet
</syntaxhighlight>
После того как настроены Puppet и PuppeDB, можно перейти к написанию манифеста для определения серийного номера агентов.
Пример получения серийного номера машины:
<syntaxhighlight lang="ini">
exec { 'serial':
command => 'dmidecode -t system | grep Serial'
}
</syntaxhighlight>
Так же можно указать агентов, на которых будет запускаться манифест:
<syntaxhighlight lang="ini">
node 'agent1', 'agent2', 'agent3' {
exec { 'serial':
command => 'dmidecode -t system | grep Serial'
}
}
 
node default {}
</syntaxhighlight>
Агенты раз в 30 минут опрашивают сервер и выполняют адресованные им манифесты. Периодичность опросов можно изменить в манифесте.
Для принудительного запуска манифеста, необходимо выполнить на агенте:
<syntaxhighlight lang="bash">
# puppet agent --test --debug
</syntaxhighlight>
 
== Готовые манифесты ==
 
=== Прописывание репозитория ===
 
<syntaxhighlight lang="ruby">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"',
}</syntaxhighlight>
 
=== Обновление системы ===
 
Для обновления системы каждый день в промежутке между 5-8 утра можно использовать следующий манифест:
 
<syntaxhighlight lang="ruby">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',
}</syntaxhighlight>
 
== Советы ==
* Для {{cmd|command}} указывайте полный путь к выполняемому файлу;
 
 
[[Category: puppet]][[Category: puppetserver]]
[[Категория:Управление конфигурациями]][[Категория:Управление автоматизацией]]
{{Category navigation|title=Управление конфигурациями|category=Управление конфигурациями|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Управление автоматизацией|category=Управление автоматизацией|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=HOWTO|category=HOWTO|sortkey={{SUBPAGENAME}}}}

Текущая версия от 02:21, 8 апреля 2023

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


Установка 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 вы можете подставить, при необходимости, имя вашего сервера.

Внимание! При выключенной службе foreman необходимо выключить параметр external_nodes в /etc/puppet/puppet.conf и перезапустить службу puppet


Для проверки работы агента необходимо выполнить команду:

# 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: "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 указывайте полный путь к выполняемому файлу;