Puppet: различия между версиями
Зануда (обсуждение | вклад) Нет описания правки |
Зануда (обсуждение | вклад) Нет описания правки |
||
(не показано 17 промежуточных версий 2 участников) | |||
Строка 6: | Строка 6: | ||
Необходимо установить следующие пакеты: | Необходимо установить следующие пакеты: | ||
<pre># apt-get install puppet | <pre># apt-get install puppet puppetserver</pre> | ||
==== Настройка puppet master ==== | ==== Настройка puppet master ==== | ||
Прежде всего нужно настроить ваш dns сервер на резолва адресов. | Прежде всего нужно настроить ваш dns сервер на резолва адресов. | ||
Для примера можно внести настройки в файл | Для примера можно внести настройки в файл {{path|/etc/hosts}}: | ||
<pre>127.0.0.1 localhost.localdomain localhost | <pre>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</pre> | ||
После установки всех пакетов настройки dns, конфигурационные файлы puppet находятся в директории {{path|/etc/puppet/}} | После установки всех пакетов настройки dns, конфигурационные файлы puppet находятся в директории {{path|/etc/puppet/}}. Измените файл настройки {{path|/etc/puppet/puppet.conf}} так: | ||
<pre> | <pre> | ||
[main] | [main] | ||
Строка 28: | Строка 28: | ||
Запуск сервисов:<br> | Запуск сервисов:<br> | ||
<pre># systemctl start puppet | <pre># systemctl start puppet | ||
# systemctl start | # systemctl start puppetserver</pre> | ||
Для подписи всех сертификатов необходимо выполнить команду:<br> | Для подписи всех сертификатов необходимо выполнить команду:<br> | ||
<pre># puppet cert sign –all</pre> | <pre># puppet cert sign –all</pre> | ||
==== Настройка агента puppet ==== | ==== Настройка агента puppet ==== | ||
Для примера так же на клиенте был настроен файл {{path|/etc/hosts}}, как показано выше.<br> | |||
Файл настроек агента {{path|/etc/puppet/puppet.conf}} должен выглядеть следующим образом:<br> | |||
Для примера так же на клиенте был настроен файл hosts, как показано выше.<br> | |||
Файл настроек агента puppet.conf | |||
<pre>[agent] | <pre>[agent] | ||
server=puppetserver</pre> | server=puppetserver</pre> | ||
Однако, вместо ''puppetserver'' вы можете подставить, при необходимости, имя вашего сервера. | |||
Для проверки работы агента необходимо выполнить команду:<br> | Для проверки работы агента необходимо выполнить команду:<br> | ||
<pre># puppet agent -t</pre> | <pre># puppet agent -t</pre> | ||
==== Запуск puppet ==== | |||
Разрешаем самозапуск службы puppet, и перезапускаем её: | |||
# systemctl enable puppet | |||
# systemctl restart puppet | |||
==== 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 ==== | ||
Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в {{path|/etc/puppet}}: | Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в {{path|/etc/puppet}}: | ||
Строка 50: | Строка 62: | ||
manifests</pre> | manifests</pre> | ||
Внесем корректировки в файл puppet.conf: | Внесем корректировки в файл {{path|/etc/puppet/puppet.conf}}: | ||
<pre>[master] | <pre>[master] | ||
environment=production</pre> | environment=production</pre> | ||
Строка 77: | Строка 89: | ||
Notice: Applied catalog in 0.03 seconds</source> | Notice: Applied catalog in 0.03 seconds</source> | ||
==== Работа с сертификатами ==== | |||
По умолчанию при запуске после установки '''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 ==== | |||
Пред запуском puppetserver делаем изменения в файле ''/etc/puppet/puppet.conf'' | Пред запуском puppetserver делаем изменения в файле ''/etc/puppet/puppet.conf'' | ||
[main] | [main] | ||
basemodulepath = /opt/ | basemodulepath = /opt/lib/puppet-modules:/usr/lib/puppet-modules | ||
codedir = /etc/puppet/code | codedir = /etc/puppet/code | ||
environmentpath = /etc/puppet/code/environments | environmentpath = /etc/puppet/code/environments | ||
Строка 118: | Строка 146: | ||
autosign = /etc/puppet/autosign.conf { mode = 0664 } | autosign = /etc/puppet/autosign.conf { mode = 0664 } | ||
ca = true | ca = true | ||
certname = sample.server | certname = sample.server.name | ||
logdir = /var/log/puppetserver | logdir = /var/log/puppetserver | ||
parser = current | parser = current | ||
Строка 125: | Строка 153: | ||
strict_variables = false | strict_variables = false | ||
vardir = /var/lib/puppetserver/server_data | vardir = /var/lib/puppetserver/server_data | ||
report = true | |||
# external_nodes = /usr/lib/puppet-modules/theforeman-foreman/files/external_node_v2.rb | |||
# node_terminus = exec | |||
Чтобы дать возможность обрабатывать запросы о окружении Puppet Server редактируем файл ''/etc/puppet/auth.conf'': | |||
path /puppet/v3/environment_classes | path /puppet/v3/environment_classes | ||
method find | method find | ||
Строка 140: | Строка 168: | ||
Cоздаем файл ''/etc/puppet/foreman.yaml'' | Cоздаем файл ''/etc/puppet/foreman.yaml'' | ||
--- | --- | ||
# Update for your Foreman and Puppet master hostname(s) | # Update for your Foreman and Puppet master hostname(s) | ||
Строка 155: | Строка 182: | ||
:threads: null | :threads: null | ||
Разрешаем самозапуск служб puppetserver, puppet, и запускаем их: | |||
# systemctl enable puppetserver puppet | |||
# systemctl start puppetserver | |||
# systemctl start puppet | |||
== Пример использования Puppet + PuppetDB для инвентаризация управляемых машин == | == Пример использования Puppet + PuppetDB для инвентаризация управляемых машин == | ||
Строка 346: | Строка 366: | ||
[[Category: puppet]] | [[Category: puppet]][[Category: puppetserver]] | ||
[[Категория:Управление конфигурациями]] | [[Категория:Управление конфигурациями]][[Категория:Управление автоматизацией]] | ||
{{Category navigation|title=Управление конфигурациями|category=Управление конфигурациями|sortkey={{SUBPAGENAME}}}} | {{Category navigation|title=Управление конфигурациями|category=Управление конфигурациями|sortkey={{SUBPAGENAME}}}} | ||
{{Category navigation|title=Управление автоматизацией|category=Управление автоматизацией|sortkey={{SUBPAGENAME}}}} | |||
{{Category navigation|title=HOWTO|category=HOWTO|sortkey={{SUBPAGENAME}}}} |
Версия от 13:10, 18 апреля 2021
Черновик
Установка 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
В секции main находятся глобальные настройки сервиса, а в секции master, находятся настройки сервера puppet.
Параметр server говорит клиенту, с каким сервером работать.
Параметр certname задает имя с которым клиент будет ображаться к серверу.
Запуск сервисов:
# systemctl start puppet # systemctl start puppetserver
Для подписи всех сертификатов необходимо выполнить команду:
# puppet cert 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
Работа с сертификатами
По умолчанию при запуске после установки 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
Пред запуском puppetserver делаем изменения в файле /etc/puppet/puppet.conf
[main] basemodulepath = /opt/lib/puppet-modules:/usr/lib/puppet-modules codedir = /etc/puppet/code environmentpath = /etc/puppet/code/environments hiera_config = $confdir/hiera.yaml hostprivkey = $privatekeydir/$certname.pem { mode = 640 } logdir = /var/log/puppet pluginfactsource = puppet:///pluginfacts pluginsource = puppet:///plugins privatekeydir = $ssldir/private_keys { group = service } reports = foreman rundir = /var/run/puppet server = sample.server.name show_diff = true ssldir = /etc/puppet/ssl vardir = /var/cache/puppet [agent] classfile = $statedir/classes.txt default_schedules = false environment = production listen = false localconfig = $vardir/localconfig masterport = 8140 noop = false report = true runinterval = 1800 splay = false splaylimit = 1800 usecacheonfailure = true [master] autosign = /etc/puppet/autosign.conf { mode = 0664 } ca = true certname = sample.server.name logdir = /var/log/puppetserver parser = current rundir = /var/run/puppetserver ssldir = /etc/puppet/ssl strict_variables = false vardir = /var/lib/puppetserver/server_data report = true # external_nodes = /usr/lib/puppet-modules/theforeman-foreman/files/external_node_v2.rb # node_terminus = exec
Чтобы дать возможность обрабатывать запросы о окружении Puppet Server редактируем файл /etc/puppet/auth.conf:
path /puppet/v3/environment_classes method find allow *
Проверяем наличие файла /etc/puppet/autosign.conf и установленные на него разрешения
touch /etc/puppet/autosign.conf chmod 664 /etc/puppet/autosign.conf
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 puppetserver puppet # systemctl start puppetserver # systemctl start 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 указывайте полный путь к выполняемому файлу;