![](https://linux-notes.org/wp-content/uploads/2017/08/Ustanovka-Puppet-v-UnixLinux-660x320.jpg)
Установка Puppet в Unix/Linux
Puppet — кроссплатформенное клиент-серверное ПО, которое позволяет централизованно управлять конфигурацией ОС и утилит, которые установлены на разных серверах. Многие большие компании используют puppet для своих целей.
Узлы сети, управляемые с помощью Puppet, периодически опрашивают сервер, получают и применяют внесённые администратором изменения в конфигурацию. Конфигурация описывается на специальном декларативном предметно-ориентированном языке. После того, как вы сможете управлять своими серверами с помощью Puppet и других средств автоматизации, у вас будет больше свободного времени, которое можно использовать для улучшения других аспектов вашей установки.
Puppet выпускается в двух вариантах: Puppet Enterprise и open source Puppet. Он работает на большинстве дистрибутивов Linux, на разных платформах UNIX и Windows.
Паппет терминология.
- Facts: Паппет агент на каждом узле отправляет данные о состоянии ноды ( которые называются фактами) на сервер с puppet-master-ом.
- Catalog: Сервер с паппет-мастером использует факт чтобы скомпилировать подробные данные о том, как должен быть сконфигурирован узел ( это так званый каталог) и отправить его обратно на паппет-агент. Паппет-агент вносит любые изменения в catalog. Puppet-agent может симулировать данные изменения (имеется опция — ‘—noop’) для того, чтобы провести тесты.
- Report: Каждый паппет-агент отправляет отчет на паппет-масте с указанием любых изменений, внесенных в конфигурацию.
- Report Collection: Открытое puppet API которе может быть использовано для отправки данных. Таким образом, инфраструктура может использоваться совместно с другими командами.
Особенности Puppet
- Разработан таким образом, что он предотвращает дублирование выполнение запущенных манифестов.
- Готовый к использованию инструмент.
- Мощный Framework.
- Упрощаете выполнение рутинных задач системного администратора.
- Помогает в управлении физическими и виртуальными устройствами, а также облаками.
У меня имеется:
- 192.168.130.10 puppet-server
- 192.168.13.207 puppet-agent
Начнем!
Установка Puppet в Unix/Linux
Puppet в репозиториях состоит из нескольких пакетов, puppet-сервер и puppet-клиент — это 2 основных пакета которые потребуются.
Паппет поддерживает 2 режима использования:
- Standalone Mode — это когда устанавливается на каждую из машин puppet-server и puppet-agent и он провиженит все дело на одной только ноде. Все манифесты, все настройки будет только на одном сервере. Можно запускать по cron.
- Master-Agent — это когда у вас имеется puppet-server и установленные puppet-agent-ы на других машинах. Puppet-агент периодически отправляет факты на puppetmaster и запрашивает каталог. Puppetmaster компилирует и возвращает каталог конкретного узла, используя источники информации, к которым он имеет доступ.
Установка Puppet в Debian/Ubuntu
Добавляем репозиторий, в зависимости от вашего типа ОС, например:
# cd /usr/local/src && wget https://apt.puppetlabs.com/puppetlabs-release-pc1-VERSION.deb # dpkg -i puppetlabs-release-pc1-*.deb && apt-get update
Где, VERSION — версия Debian/Ubuntu. Например, — trusty, jessie,wheezy и так далее.
Данный репозиторий содержит puppet4, и если вы хотели бы установить 5-ю версию ПО (на данный момент самая последняя), то стоит использовать:
# cd /usr/local/src && wget https://apt.puppetlabs.com/puppet5-release-VERSION.deb # dpkg -i puppetlabs-release-pc1-*.deb && apt-get update
Где, VERSION — версия Debian/Ubuntu. Например, — trusty, jessie,wheezy и так далее.
Установка puppet-server в Debian/Ubuntu
Для установки puppetserver выполните:
# apt-get -y install puppetserver
По умолчанию Puppet-server настроен на использование 2 ГБ ОЗУ. Вы должны настроить этот параметр в зависимости от того, насколько свободна память вашего сервера и сколько узлов он будет менеджить.
Открываем:
# vim /etc/default/puppetserver
Затем, найдите строку JAVA_ARGS и используйте параметры -Xms и -Xmx, чтобы установить распределение памяти. Например, если вы хотите использовать 4ГБ памяти, строка должна выглядеть так:
JAVA_ARGS="-Xms4g -Xmx4g"
Сохраняем и закрываем файл.
Если вы не предполагаете использовать DNS, вы можете добавить записи в файл на сервере и клиенте. Открываем файл:
# vim /etc/hosts
Прописываем имя для сервера:
# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.130.10 puppet-server 192.168.13.207 puppet-agent
Смотрим какой хостнейм:
# hostname puppet-server
ИЛИ:
[vagrant@puppet-server ~]$ facter | grep hostname hostname => puppet-server [vagrant@puppet-server ~]$ facter | grep fqdn fqdn => puppet-server [vagrant@puppet-server ~]$
Стоит прописать нужный PATH, для этого открываем:
# vim ~/.bash_profile
И прописываем:
export PUPPET_HOME=/opt/puppetlabs/ PATH=$PATH:$HOME/bin:$PUPPET_HOME/bin export PATH
Чтобы изменения вступили в силу, выполните:
# . ~/.bash_profile
Теперь можно запустить Puppet-server с помощью этой команды:
# service puppetserver restart
Добавляем паппет в автозагрузку ОС:
# puppet resource service puppetserver ensure=running enable=true
Убедимся что он работает:
# netstat -natpl | grep 8140 tcp 0 0 0.0.0.0:8140 0.0.0.0:* LISTEN 20870/ruby
Так же, можно запустить puppetmaster без демона:
# puppet master --mkusers --verbose --no-daemonize
После чего, можно использовать паппет. Например, можно посмотреть версию puppet-server можно вот так:
# puppet -V 4.10.6
Puppet Server запущен, но он еще не управляет агентами. Сейчас перейдем к этому шагу.
Установка puppet-agent в Debian/Ubuntu
Выполняем команду:
# apt-get update && apt-get install puppet-agent -y
Стоит прописать нужный PATH, для этого открываем:
# vim ~/.bash_profile
И прописываем:
export PUPPET_HOME=/opt/puppetlabs/ PATH=$PATH:$HOME/bin:$PUPPET_HOME/bin export PATH
Чтобы изменения вступили в силу, выполните:
# . ~/.bash_profile
Для автозагрузку агента при старте ОС, используйте:
# puppet resource service puppet ensure=running enable=true
Теперь можно запустить Puppet-server с помощью этой команды:
# service puppet restart
Как-то так.
Установка Puppet в CentOS/Fedora/RedHat
Нужно подготовить сервер к использованию…
И так, можно подключить репозиторий EPEL — включить EPEL репозиторий на CentOS и потом, выполним поиск пакетов:
# yum list puppet*
Но лучше всего, использовать уже готовый репозиторий с официального сайта.
Смотрим какйо тип ОС имеется в системе, для этого можно выполнить:
# uname -m x86_64
И потом выбираем версию ОС….
CentOS 6:
# rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
CentOS 7:
# rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-22.0-2.noarch.rpm
И добавим:
# rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
Проверяем:
# yum repolist | grep puppet
Получаем:
puppetlabs-deps/x86_64 Puppet Labs Dependencies El 7 - x86_64 17 puppetlabs-products/x86_64 Puppet Labs Products El 7 - x86_64 225
У меня CentOS 7 и я буду приводить примеры именно для нее. Но это не сильно существенно!
Установка puppet-server в CentOS/Fedora/RedHat
Устанавливаем сам puppet-server:
# yes| yum -y install puppetserver
Выставим ограничение по использованию RAM в puppet:
# vim /etc/sysconfig/puppetserver
Затем найдите строку JAVA_ARGS и используйте -Xms и -Xmx параметры , чтобы установить распределение памяти. Например, если вы хотите использовать 4 ГБ памяти, строка должна выглядеть так:
JAVA_ARGS="-Xms4g -Xmx4g"
PS: У меня, нет сколько RAM (т.к я использую паппет для тестов) и по этому, я выделю 512Мб:
JAVA_ARGS="-Xms512m -Xmx512m"
АХ ДА, ЭТО НУЖНО ДЛЯ PUPPET 4 (насчет 5-го я не уверен), Т.К ИСПОЛЬЗУЕТСЯ JAVA ВНУТРИ PUPPET.
Данный сервер, написан на рубене, по этому — он тоже поставится (вместе с зависимостями).
Если вы не предполагаете использовать DNS, вы можете добавить записи в файл на сервере и клиенте. Открываем файл:
# vim /etc/hosts
Прописываем имя для сервера:
# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.130.10 puppet-server 192.168.13.207 puppet-agent
Смотрим какой хостнейм:
# hostname puppet-server
ИЛИ:
[vagrant@puppet-server ~]$ facter | grep hostname hostname => puppet-server [vagrant@puppet-server ~]$ facter | grep fqdn fqdn => puppet-server [vagrant@puppet-server ~]$
Запускаем сервер с паппетом:
# service puppetmaster start
Или:
# systemctl start puppetserver
Убедимся что он работает:
# netstat -natpl | grep 8140 tcp 0 0 0.0.0.0:8140 0.0.0.0:* LISTEN 20870/ruby
Так же, можно запустить puppetmaster без демона:
# puppet master --mkusers --verbose --no-daemonize
Если используете puppet 4, стоит прописать нужный PATH, для этого открываем:
# vim ~/.bash_profile
И прописываем:
export PUPPET_HOME=/opt/puppetlabs/ PATH=$PATH:$HOME/bin:$PUPPET_HOME/bin export PATH
Чтобы изменения вступили в силу, выполните:
# . ~/.bash_profile
После чего, можно использовать паппет. Например, можно посмотреть версию puppet-server можно вот так:
# puppet -V 4.10.6
Так же, можно прогнать тест:
# puppet agent --test --server=`hostname` Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for puppet-server Info: Applying configuration version '1503439536' Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml Notice: Applied catalog in 0.04 seconds
Для обновления сервера, используйте следующую команду:
# puppet resource package puppet-server ensure=latest
Как-то так.
-===Добавляем правило — iptables ===-
Если используете iptables, то пропишем правило:
# iptables -I INPUT 2 -p tcp --dport 8140 -j ACCEPT
И еще одно (если его нет):
# iptables -I -INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
После чего, выполняем сохранение:
# service iptables save
Добавляем в автозапуск:
# chkconfig puppetmaster on
И чтобы проверить, выполните:
# chkconfig --list | grep puppetmaster
ИЛИ:
# systemctl enable puppetserver # systemctl start puppetserver
-===Добавляем правило — systemd===-
# firewall-cmd --permanent --zone=public --add-port=8140/tcp # firewall-cmd --reload
Идем дальше…..
Посмотреть все текущие настройки можно выполнив следующую команду:
# puppet apply --configprint all
Для каждой опции, можно выводить значение — это можно использовать следующим образом:
# puppet master --configprint syslogfacility
Пока что сервер настроили и переходим к установке агентов.
Установка puppet-agent в CentOS/Fedora/RedHat
Puppet-agent должен быть установлен на сервер, который будет управлять puppet-master (puppet-server).
Устанавливаем puppet-agent:
# yum -y install puppet-agent
На каждом клиенте Puppet добавьте запись о сервере + хостнейм для нод с клиентом:
# cat /etc/hosts 127.0.0.1 localhost 192.168.130.10 puppet-server 192.168.13.207 puppet-agent
Проверяем наpuppet-анегте имя хоста:
# hostname puppet-agent
Так же, если используете puppet 4, стоит прописать нужный PATH, для этого открываем:
# vim ~/.bash_profile
И прописываем:
export PUPPET_HOME=/opt/puppetlabs/ PATH=$PATH:$HOME/bin:$PUPPET_HOME/bin export PATH
Чтобы изменения вступили в силу, выполните:
# . ~/.bash_profile
После чего, можно использовать паппет. Например, можно посмотреть версию puppet-server можно вот так:
# puppet -V 4.10.6
Теперь, когда агент Puppet установлен, запустите его с помощью этой команды:
# puppet resource service puppet ensure=running enable=true
Получаем:
Notice: /Service[puppet]/ensure: ensure changed 'stopped' to 'running' service { 'puppet': ensure => 'running', enable => 'true', }
После этого, он будет запускаться автоматически, после старта ОС.
Проверяем, запущен ли он:
# service puppet status && echo -e "\n" && ps aux | grep puppet | grep -Ev "grep"
Добавляем в автозапуск:
# chkconfig puppet on
Для обновления клиента, используйте команду:
# puppet resource package puppet ensure=latest
Теперь проверим как всё работает.
Установка Puppet на Mac OS X
Пока что не было необходимости в этом.
Установка Puppet на FreeBSD
Пока что не было необходимости в этом.
Настройка Puppet в Unix/Linux
Давайте настроим сие чудо.
Настройка puppet-agent-а в CentOS/Fedora/RedHat
Так же, настраиваем puppet-agent-ы:
# cat /etc/puppetlabs/puppet/puppet.conf # This file can be used to override the default puppet settings. # See the following links for more details on what settings are available: # - https://docs.puppetlabs.com/puppet/latest/reference/config_important_settings.html # - https://docs.puppetlabs.com/puppet/latest/reference/config_about_settings.html # - https://docs.puppetlabs.com/puppet/latest/reference/config_file_main.html # - https://docs.puppetlabs.com/puppet/latest/reference/configuration.html # [main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet factpath=$vardir/lib/facter #templatedir=$confdir/templates # certname = puppet-agent server = puppet-server #environment = production #runinterval = 5m #1h [agent] environment = production show_diff = true runinterval = 5m
Вы можете изменить значение runinterval в зависимости от требования, вы можете установить значение в секундах; Это определяет, как долго агент должен ждать между двумя catalog запросами.
Перезапускаем клиент:
# service puppet restart
В первый раз, когда puppet-agent запускается, он отправит запрос на подпись сертификата в puppet-server. Прежде чем Puppet-server сможет взаимодействовать с puppet-agent-ом и управлять им, он должен подписать сертификат конкретного агента.
Можно посмотреть некоторые пути к конфигам следующим образом:
# puppet agent --configprint rundir /var/run/puppet # puppet agent --configprint pidfile /var/run/puppet/agent.pid
Настройка puppet-server в CentOS/Fedora/RedHat
Теперь как уже имеется puppet-server (он же, puppetmaster) и ноды с puppet-agent-ами, можно кое-что настроить еще.
# vim /etc/puppetlabs/puppet/puppet.conf
Вот мой конфиг:
# This file can be used to override the default puppet settings. # See the following links for more details on what settings are available: # - https://docs.puppetlabs.com/puppet/latest/reference/config_important_settings.html # - https://docs.puppetlabs.com/puppet/latest/reference/config_about_settings.html # - https://docs.puppetlabs.com/puppet/latest/reference/config_file_main.html # - https://docs.puppetlabs.com/puppet/latest/reference/configuration.html [master] vardir = /opt/puppetlabs/server/data/puppetserver logdir = /var/log/puppetlabs/puppetserver rundir = /var/run/puppetlabs/puppetserver pidfile = /var/run/puppetlabs/puppetserver/puppetserver.pid codedir = /etc/puppetlabs/code dns_alt_names = puppet-server [main] certname = puppet-server server = puppet-server environment = production runinterval = 5m
Перезапускаем puppetmaster:
# service puppetserver restart
И так, чтобы просмотреть все неподписанные запросы сертификата, выполните на puppet-server-е, следующую команду:
# puppet cert list
Если вы настроили свой puppet-agent, вы увидите один запрос. Он будет выглядеть примерно так:
"puppet-agent" (SHA256) B2:47:29:88:7F:94:EA:CC:12:D5:E2:DB:A0:D1:C3:E8:DA:2A:0F:49:DB:08:7A:DC:14:89:27:EA:5D:D7:19:57
Чтобы подписать сертификат, используйте команду:
# puppet cert sign puppet-agent Signing Certificate Request for: "puppet-agent.localdomain" (SHA256) B2:47:29:88:7F:94:EA:CC:12:D5:E2:DB:A0:D1:C3:E8:DA:2A:0F:49:DB:08:7A:DC:14:89:27:EA:5D:D7:19:57 Notice: Signed certificate request for puppet-agent.localdomain Notice: Removing file Puppet::SSL::CertificateRequest puppet-agent.localdomain at '/etc/puppetlabs/puppet/ssl/ca/requests/puppet-agent.localdomain.pem'
Где, puppet-agent- это название ноды.
Puppet-master теперь может связываться и управлять узлом, которому принадлежит подписанный сертификат.
Если вы хотите подписать все текущие запросы, используйте опцию -all, например:
# puppet cert sign --all
Вы можете удалить хост из Puppet или перестроить хост, а затем добавить его обратно в Puppet. В этом случае вы должны удалить сертификат хоста с Puppet-а. Для этого вы можете использовать:
# puppet cert clean your_hostname
Где, your_hostname — Хостнейм ноды puppet-agent-а.
PS: Когда сервер удаляет уже подписанный сертификат для агента, вы должны удалить сертификаты из паппет-агента следующим образом:
# rm -rf /var/lib/puppet/ssl/*
Чтобы просмотреть все запросы, подписанные и неподписанные, выполните следующую команду:
# puppet cert list --all + "puppet-agent" (SHA256) 32:D4:E0:D6:0C:23:C3:62:07:BE:25:23:83:A0:79:E7:A8:7F:D0:AD:ED:1E:12:BE:2A:7E:AF:39:58:A7:D4:26 + "puppet-agent.localdomain" (SHA256) 67:47:08:E1:44:23:FC:EA:D1:89:A1:DD:95:28:27:85:3A:EB:9B:EB:7B:48:1D:C3:27:A9:4B:C7:92:D2:EE:C8 + "puppet-server" (SHA256) 8C:73:D1:FC:74:CA:96:B3:4B:92:7A:A1:7D:5A:3F:06:1B:83:F9:84:12:ED:83:0A:B1:94:A9:D2:14:22:7F:AE (alt names: "DNS:puppet", "DNS:puppet-server")
Просмотрите отпечаток сертфиката клиента
# puppet agent --fingerprint
Можно посмотреть некоторые пути к конфигам следующим образом:
# puppet master --configprint rundir /var/run/puppet # puppet master --configprint pidfile /var/run/puppet/master.pid
Каждый раз добавлять сертификаты для новых нод — это не труъ! Можно сделать так, чтобы сервер автоматически добавлял новые ноды в себе в листинг добавлял их сертификат себе на сервер. Для этого, смотрим где хранится конфиг:
$ puppet config print --section master confdir
Обычно, этот путь находится:
/etc/puppet
или
/etc/puppetlabs/puppet/
У меня — /etc/puppetlabs/puppet/ и в этой директории, открываем (создаем) файл:
# vim /etc/puppetlabs/puppet/autosign.conf
В него прописываем доменные имена которые будут добавляться автоматически, например:
www.linux-notes.org *.linux-notes.org *
И после чего, все будет выполнятся в автоматическом режиме.
Настройка hiera на puppet-server-е
Прежде всего, я бы рекомендовал, — настроить хиеру (нужна чтобы определять переменные), для этого, — открываем:
# vim /etc/puppetlabs/puppet/hiera.yaml
Или
# vim /etc/puppet/hiera.yaml
И приводим его к следующему виду:
--- :backends: - yaml - json #:yaml: # datadir is empty here, so hiera uses its defaults: #- /etc/puppetlabs/code/environments/%{environment}/hieradata on *nix # - %CommonAppData%\PuppetLabs\code\environments\%{environment}\hieradata on Windows # When specifying a datadir, make sure the directory exists. # :datadir: :yaml: #:datadir: "/etc/puppetlabs/code/environments/%{::environment}/hieradata" :datadir: "/etc/puppetlabs/code/environments/production/hieradata" :json: :datadir: "/etc/puppetlabs/code/environments/%{::environment}/hieradata" :hierarchy: - "node/%{::trusted.certname}" - "nodes/%{::fqdn}" - "roles/%{::role}" - "osfamily/%{::osfamily}" - "virtual/%{::virtual}" #- "default" :logger: console :merge_behavior: native :deep_merge_options: {}
Создаем исмолическую ссылку:
# ln -s /etc/puppetlabs/puppet/hiera.yaml /etc/hiera.yaml
Создам для примера хиеру-файл:
# vim /etc/puppetlabs/code/environments/production/hieradata/nodes/puppet-server.yaml
и прописываем:
zabbix::host: 'hiera_host.com' zabbix::agent::hostname: - test.machine-hiera.com zabbix_ip: 'hiera.com'
И смотрим что вышло:
# hiera -d zabbix::agent::hostname ::fqdn=puppet-server DEBUG: 2017-10-13 02:49:41 +0100: Hiera YAML backend starting DEBUG: 2017-10-13 02:49:41 +0100: Looking up zabbix::agent::hostname in YAML backend DEBUG: 2017-10-13 02:49:41 +0100: Looking for data source nodes/puppet-server DEBUG: 2017-10-13 02:49:41 +0100: Found zabbix::agent::hostname in nodes/puppet-server ["test.machine-hiera.com"]
Или:
# hiera -d zabbix_ip ::fqdn=puppet-server DEBUG: 2017-10-13 02:50:15 +0100: Hiera YAML backend starting DEBUG: 2017-10-13 02:50:15 +0100: Looking up zabbix_ip in YAML backend DEBUG: 2017-10-13 02:50:15 +0100: Looking for data source nodes/puppet-server DEBUG: 2017-10-13 02:50:15 +0100: Found zabbix_ip in nodes/puppet-server hiera.com
Видим что работает все.
Работа с Puppet в Unix/Linux
Для начала, можно создать простой манифест, для этого создаем файл (на стороне сервера с паппет):
# touch /etc/puppetlabs/code/environments/production/manifests/site.pp
Открываем созданный файл и прописываем:
file {'/tmp/example-ip': # resource type file and filename ensure => present, # make sure it exists mode => '0644', # file permissions content => "Here is my Public IP Address: ${ipaddress_eth0}.\n", # note the ipaddress_eth0 fact }
Теперь сохраните и выйдите. Вы можете либо дождаться, когда агент автоматически проведет проверку с мастером, либо вы можете запустить команду (на стороне клиента):
# puppet agent --test Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for puppet-agent.localdomain Info: Applying configuration version '1503447019' Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: defined content as '{md5}3984f4d8223482bb14254a625988f1f3' Notice: Applied catalog in 0.02 seconds [root@grafana captain]#
Видим что паппет-агент отработал манифест который создали.
PS: Для дебага, используйте «—debug» опцию:
# puppet agent --test --debug
Но давайте проверим что получилось:
# cat /tmp/example-ip
И вывод у меня будет следующим:
Here is my Public IP Address: 192.168.13.207.
Если вы хотите запускать манифест только для некоторых нод, то стоит определить узел в манифесте. Открываем:
# vim /etc/puppetlabs/code/environments/production/manifests/site.pp
и прописываем:
node 'your_node_1', 'your_node_2', 'puppet-agent.localdomain' { # applies to ns1 and ns2 nodes file {'/tmp/dns': # resource type file and filename ensure => present, # make sure it exists mode => '0644', content => "Only DNS servers get this file.\n", } } node default {} # applies to nodes that aren't explicitly defined
И тогда только для указанного списка, будет выполнятся манифест.
Так же, можно выполнить манифест руками, для этого служит команда:
# puppet apply /path_to_manifest/your_manifest_name.pp
Ничего сложного нет, нужно время на ознакомление.
Добавление модулей
Приведу наглядный(ые) пример(ы) использования.
-=== ПРИМЕР 1 — Добавление ограниченного пользователя ===-
Можно ограничить использования puppet по пользователю, для этого на puppetmaster-е (паппет сервере), создадим папку для модуля и перейдем в нее:
# mkdir /etc/puppetlabs/code/modules/accounts && cd $_
Создайте следующие каталоги, которые необходимы для функционирования модуля:
# mkdir {examples,files,manifests,templates}
Где:
- examples — Директория для тестирования модуля локально.
- files — Папка, которая содержит любые статические файлы, которые могут потребоваться для отредактирования или добавления.
- manifests — Фолдер, в котором содержится фактический puppet код для модуля (т.е манифест действий).
- templates — Содержит любые не статические файлы, которые могут потребоваться.
Перейдите в каталог manifests и создайте свой первый класс под названием init.pp. Все модули требуют, чтобы файл init.pp использовался в качестве основного файла определения модуля:
# cd manifests && vim /etc/puppetlabs/code/modules/accounts/manifests/init.pp
И вставляем в него:
class accounts { include accounts::groups $rootgroup = $osfamily ? { 'Debian' => 'sudo', 'RedHat' => 'wheel', default => warning('This distro not supported by Accounts module'), } user { 'vagrant': ensure => present, home => '/home/vagrant', shell => '/bin/bash', managehome => true, gid => 'vagrant', groups => "$rootgroup", password => '$1$TkCXLpmE$9flKgFkEQLmSauT94f4Ph0' } }
Примите во внимание, vagrant — это пользователь на puppet-server-е, который уже имеется в системе. И, password — это хеш от пароля (для пользователя vagrant) и его можно получить, выполнив:
# openssl passwd -1 Password: Verifying - Password: $1$TkCXLpmE$9flKgFkEQLmSauT94f4Ph0
Создаем еще один файл:
# vim /etc/puppetlabs/code/modules/accounts/manifests/groups.pp
И добавьте следующее содержимое:
class accounts::groups { group { 'vagrant': ensure => present, } }
Проверяем валидность файла:
# puppet parser validate /etc/puppetlabs/code/modules/accounts/manifests/init.pp
Открываем:
# vim /etc/puppetlabs/code/modules/accounts/examples/init.pp
И прописываем:
include accounts
Давайте протестируем модуль:
# puppet apply --noop /etc/puppetlabs/code/modules/accounts/examples/init.pp
Получаем вывод:
Notice: Compiled catalog for puppet-server in environment production in 0.08 seconds Notice: /Stage[main]/Accounts/User[vagrant]/home: current_value /home/vagrant, should be /home/username (noop) Notice: /Stage[main]/Accounts/User[vagrant]/gid: current_value 1000, should be username (noop) Notice: Class[Accounts]: Would have triggered 'refresh' from 2 events Notice: Stage[main]: Would have triggered 'refresh' from 1 events Notice: Applied catalog in 0.05 seconds
Применяем изменения:
# puppet apply /etc/puppetlabs/code/modules/accounts/examples/init.pp
И получаем вывод:
Notice: Compiled catalog for puppet-server in environment production in 0.06 seconds Notice: /Stage[main]/Accounts/User[vagrant]/password: changed password Notice: /Stage[main]/Accounts/User[vagrant]/groups: groups changed 'vagrant' to ['vagrant', 'wheel'] Notice: Applied catalog in 0.05 seconds
Как вы уже поняли, я применил созданный модуль на сервере с паппет и он применил все то, что я описывал ранее.
-=== ПРИМЕР 2 — Редактирование SSH настроек ===-
Копируем конфиг-файл:
# cp -r /etc/ssh/sshd_config /etc/puppetlabs/code/modules/accounts/files
Открываем конфиг и правим строку:
PermitRootLogin no
Создаем манифест:
# vim /etc/puppetlabs/code/modules/accounts/manifests/ssh.pp
И прописываем в него:
class accounts::ssh { file { '/etc/ssh/sshd_config': ensure => present, source => 'puppet:///modules/accounts/sshd_config', } }
Открываем файл:
# vim /etc/puppetlabs/code/modules/accounts/manifests/init.pp
И добавляем в него:
include accounts::ssh
Должно выйти, что-то типа:
class accounts { include accounts::groups include accounts::ssh $rootgroup = $osfamily ? { 'Debian' => 'sudo', 'RedHat' => 'wheel', default => warning('This distro not supported by Accounts module'), } user { 'vagrant': ensure => present, home => '/home/vagrant', shell => '/bin/bash', managehome => true, gid => 'vagrant', groups => "$rootgroup", password => '$1$TkCXLpmE$9flKgFkEQLmSauT94f4Ph0' } }
Сново, проверяем валидацию:
# puppet parser validate /etc/puppetlabs/code/modules/accounts/manifests/ssh.pp
Выполняем тест:
# puppet apply --noop /etc/puppetlabs/code/modules/accounts/examples/init.pp Notice: Compiled catalog for puppet-server in environment production in 0.47 seconds Notice: /Stage[main]/Accounts::Ssh/File[/etc/ssh/sshd_config]/content: current_value {md5}0440a9608de01c4fa1c1dd6301b568ec, should be {md5}4ffaa0befebc4ea61f5353b0a21cd7c7 (noop) Notice: /Stage[main]/Accounts::Ssh/Service[sshd]: Would have triggered 'refresh' from 1 events Notice: Class[Accounts::Ssh]: Would have triggered 'refresh' from 2 events Notice: Stage[main]: Would have triggered 'refresh' from 1 events Notice: Applied catalog in 0.05 seconds
Применяем:
# puppet apply /etc/puppetlabs/code/modules/accounts/examples/init.pp Notice: Compiled catalog for puppet-server in environment production in 0.50 seconds Notice: /Stage[main]/Accounts::Ssh/File[/etc/ssh/sshd_config]/content: content changed '{md5}0440a9608de01c4fa1c1dd6301b568ec' to '{md5}4ffaa0befebc4ea61f5353b0a21cd7c7' Notice: /Stage[main]/Accounts::Ssh/Service[sshd]: Triggered 'refresh' from 1 events Notice: Applied catalog in 0.18 seconds
Все четко!
-=== ПРИМЕР 3 — Добавление и настройка IPTABLES ===-
В этом разделе я покажу как можно настраивать правила брандмауэра с помощью iptables. Однако по умолчанию эти правила не будут сохраняться при перезагрузке. Чтобы этого избежать, перед тем, как продолжить, установите соответствующий пакет на каждом узле (puppetmaster- е, puppet-агенте):
Для Debian/Ubuntu:
# apt install iptables-persistent
Для CentOS 7:
# systemctl stop firewalld && systemctl disable firewalld # yum install iptables-services -y
PS : Полезное чтиво:
Выключить/Включить Firewalld в RHEL 7/CentOS 7
Отключение Firewall в RHEL/CentOS /RedHat
Идем дальше, нужно установить модуль на puppetmaster-е, для этого служит следующая команда:
# puppet module install puppetlabs-firewall Notice: Preparing to install into /etc/puppetlabs/code/environments/production/modules ... Notice: Downloading from https://forgeapi.puppet.com ... Notice: Installing -- do not interrupt ... /etc/puppetlabs/code/environments/production/modules └── puppetlabs-firewall (v1.9.0)
Вывод говорит что модуль установился в /etc/puppetlabs/code/environments/production/modules/firewall директорию, давайте перейдем в нее:
# cd /etc/puppetlabs/code/environments/production/modules/firewall
После этого, создаем файл:
# vim manifests/pre.pp
И вставляем в него:
class firewall::pre { Firewall { require => undef, } # Accept all loopback traffic firewall { '000 lo traffic': proto => 'all', iniface => 'lo', action => 'accept', }-> #Drop non-loopback traffic firewall { '001 reject non-lo': proto => 'all', iniface => '! lo', destination => '127.0.0.0/8', action => 'reject', }-> #Accept established inbound connections firewall { '002 accept established': proto => 'all', state => ['RELATED', 'ESTABLISHED'], action => 'accept', }-> #Allow all outbound traffic firewall { '003 allow outbound': chain => 'OUTPUT', action => 'accept', }-> #Allow ICMP/ping firewall { '004 allow icmp': proto => 'icmp', action => 'accept', } #Allow SSH connections firewall { '005 Allow SSH': dport => '22', proto => 'tcp', action => 'accept', }-> #Allow HTTP/HTTPS connections firewall { '006 HTTP/HTTPS connections': dport => ['80', '443'], proto => 'tcp', action => 'accept', } }
В этой директории, создаем еще один файл:
# vim manifests/post.pp
И прописываем в него:
class firewall::post { firewall { '999 drop all': proto => 'all', action => 'drop', before => undef, } }
Данные правила будут применятся в фаэрволе.
Проверим валидность:
# puppet parser validate manifests/pre.pp # puppet parser validate manifests/post.pp
Создадим папку:
# mkdir examples
Создаем еще файл для тестирования:
# vim examples/init.pp
Прописываем в него:
resources { 'firewall': purge => true, } Firewall { before => Class['firewall::post'], require => Class['firewall::pre'], } class { ['firewall::pre', 'firewall::post']: } firewall { '200 Allow Puppet Master': dport => '8140', proto => 'tcp', action => 'accept', }
Валидируем:
# puppet parser validate examples/init.pp # puppet apply --noop examples/init.pp Notice: Compiled catalog for puppet-server in environment production in 0.21 seconds Notice: /Stage[main]/Firewall::Pre/Firewall[000 lo traffic]/ensure: current_value absent, should be present (noop) Notice: /Stage[main]/Firewall::Pre/Firewall[001 reject non-lo]/ensure: current_value absent, should be present (noop) Notice: /Stage[main]/Firewall::Pre/Firewall[002 accept established]/ensure: current_value absent, should be present (noop) Notice: /Stage[main]/Firewall::Pre/Firewall[003 allow outbound]/ensure: current_value absent, should be present (noop) Notice: /Stage[main]/Firewall::Pre/Firewall[004 allow icmp]/ensure: current_value absent, should be present (noop) Notice: /Stage[main]/Firewall::Pre/Firewall[005 Allow SSH]/ensure: current_value absent, should be present (noop) Notice: /Stage[main]/Firewall::Pre/Firewall[006 HTTP/HTTPS connections]/ensure: current_value absent, should be present (noop) Notice: Class[Firewall::Pre]: Would have triggered 'refresh' from 7 events Notice: /Stage[main]/Main/Firewall[200 Allow Puppet Master]/ensure: current_value absent, should be present (noop) Notice: Class[Main]: Would have triggered 'refresh' from 1 events Notice: /Stage[main]/Firewall::Post/Firewall[999 drop all]/ensure: current_value absent, should be present (noop) Notice: Class[Firewall::Post]: Would have triggered 'refresh' from 1 events Notice: Stage[main]: Would have triggered 'refresh' from 3 events Notice: Applied catalog in 1.50 seconds
Запускаем:
# puppet apply examples/init.pp Notice: Compiled catalog for puppet-server in environment production in 0.21 seconds Notice: /Stage[main]/Firewall::Pre/Firewall[000 lo traffic]/ensure: created Warning: Firewall[000 lo traffic](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: /Stage[main]/Firewall::Pre/Firewall[001 reject non-lo]/ensure: created Warning: Firewall[001 reject non-lo](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: /Stage[main]/Firewall::Pre/Firewall[002 accept established]/ensure: created Warning: Firewall[002 accept established](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: /Stage[main]/Firewall::Pre/Firewall[003 allow outbound]/ensure: created Warning: Firewall[003 allow outbound](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: /Stage[main]/Firewall::Pre/Firewall[004 allow icmp]/ensure: created Warning: Firewall[004 allow icmp](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: /Stage[main]/Firewall::Pre/Firewall[005 Allow SSH]/ensure: created Warning: Firewall[005 Allow SSH](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: /Stage[main]/Firewall::Pre/Firewall[006 HTTP/HTTPS connections]/ensure: created Warning: Firewall[006 HTTP/HTTPS connections](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: /Stage[main]/Main/Firewall[200 Allow Puppet Master]/ensure: created Warning: Firewall[200 Allow Puppet Master](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: /Stage[main]/Firewall::Post/Firewall[999 drop all]/ensure: created Warning: Firewall[999 drop all](provider=iptables): Unable to persist firewall rules: Execution of '/usr/libexec/iptables/iptables.init save' returned 1: Notice: Applied catalog in 1.93 seconds
Смотрим что получилось:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 /* 000 lo traffic */ REJECT all -- 0.0.0.0/0 127.0.0.0/8 /* 001 reject non-lo */ reject-with icmp-port-unreachable ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 /* 002 accept established */ state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 /* 004 allow icmp */ ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22 /* 005 Allow SSH */ ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 /* 006 HTTP/HTTPS connections */ ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 8140 /* 200 Allow Puppet Master */ DROP all -- 0.0.0.0/0 0.0.0.0/0 /* 999 drop all */ Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 /* 003 allow outbound */
Вроде бы все то, что прописывали в правилах — уже имеется.
Но это же я настраивал все на паппет-сервере, чтобы добавить модуль\манифест для нод, нужно кое-что прописать.
Открываем файл:
# vim /etc/puppetlabs/code/environments/production/manifests/site.pp
И прописываем:
node 'host', 'puppet-agent' { include accounts resources { 'firewall': purge => true, } Firewall { before => Class['firewall::post'], require => Class['firewall::pre'], } class { ['firewall::pre', 'firewall::post']: } }
Запускаем на паппет-агенте манифет:
# puppet agent -t Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Notice: /File[/var/lib/puppet/lib/facter]/ensure: created Notice: /File[/var/lib/puppet/lib/facter/ip6tables_version.rb]/ensure: defined content as '{md5}e1dbe35390cd819240e202709c52b1bb' Notice: /File[/var/lib/puppet/lib/facter/iptables_persistent_version.rb]/ensure: defined content as '{md5}8ea76fecb8032174823ef6fb846c83c9' Notice: /File[/var/lib/puppet/lib/facter/iptables_version.rb]/ensure: defined content as '{md5}116b96951342bf726f28fa952f2f5f4b' Notice: /File[/var/lib/puppet/lib/puppet]/ensure: created Notice: /File[/var/lib/puppet/lib/puppet/provider]/ensure: created Notice: /File[/var/lib/puppet/lib/puppet/provider/firewall]/ensure: created Notice: /File[/var/lib/puppet/lib/puppet/provider/firewall.rb]/ensure: defined content as '{md5}32d2f5e5dcc082986b82ef26a119038b' Notice: /File[/var/lib/puppet/lib/puppet/provider/firewall/ip6tables.rb]/ensure: defined content as '{md5}b70c52ef1ff2e3a8e84257289a573b6f' Notice: /File[/var/lib/puppet/lib/puppet/provider/firewall/iptables.rb]/ensure: defined content as '{md5}05fc4e96ccc3c0ae0c3949431b0502be' Notice: /File[/var/lib/puppet/lib/puppet/provider/firewallchain]/ensure: created Notice: /File[/var/lib/puppet/lib/puppet/provider/firewallchain/iptables_chain.rb]/ensure: defined content as '{md5}4d0432b240e8ecd46094a64462641e15' Notice: /File[/var/lib/puppet/lib/puppet/type]/ensure: created Notice: /File[/var/lib/puppet/lib/puppet/type/firewall.rb]/ensure: defined content as '{md5}0977fed5fef2c9a990764d8a42b9dd6d' Notice: /File[/var/lib/puppet/lib/puppet/type/firewallchain.rb]/ensure: defined content as '{md5}9262061ade5c73329db773b769ee70a2' Notice: /File[/var/lib/puppet/lib/puppet/util]/ensure: created Notice: /File[/var/lib/puppet/lib/puppet/util/firewall.rb]/ensure: defined content as '{md5}036b832027cf4301356661f9c3c3a1d9' Notice: /File[/var/lib/puppet/lib/puppet/util/ipcidr.rb]/ensure: defined content as '{md5}e1160dfd6e73fc5ef2bb8abc291f6fd5' Info: Loading facts Info: Caching catalog for puppet-agent Info: Applying configuration version '1503487204' Notice: /Stage[main]/Accounts::Groups/Group[vagrant]/ensure: created Error: /Stage[main]/Accounts::Ssh/File[/etc/ssh/sshd_config]: Could not evaluate: Could not retrieve file metadata for puppet:///modules/accounts/sshd_config: Error 500 on SERVER: Server Error: Permission denied - /etc/puppetlabs/code/modules/accounts/files/sshd_config Notice: /Stage[main]/Accounts::Ssh/Service[sshd]: Dependency File[/etc/ssh/sshd_config] has failures: true Warning: /Stage[main]/Accounts::Ssh/Service[sshd]: Skipping because of failed dependencies Notice: /Stage[main]/Accounts/User[vagrant]/ensure: created Notice: /Stage[main]/Main/Node[puppet-agent]/Firewall[9001 fe701ab7ca74bd49f13b9f0ab39f3254]/ensure: removed Notice: /Stage[main]/Main/Node[puppet-agent]/Firewall[9002 a8eb63c76896060f20aa62621c36f77a]/ensure: removed Notice: /Stage[main]/Main/Node[puppet-agent]/Firewall[9003 49bcd611c61bdd18b235cea46ef04fae]/ensure: removed Notice: /Stage[main]/Main/Node[puppet-agent]/Firewall[9004 dc0f1adfee77aa04ef7fdf348860a701]/ensure: removed Notice: /Stage[main]/Main/Node[puppet-agent]/Firewall[9005 8eee49915b9ff9ef00b6af60d5113a66]/ensure: removed Notice: /Stage[main]/Main/Node[puppet-agent]/Firewall[9006 a73ef6d2c52b1ce6c5ae8d9d326b34ed]/ensure: removed Notice: /Stage[main]/Firewall::Pre/Firewall[000 lo traffic]/ensure: created Notice: /Stage[main]/Firewall::Pre/Firewall[001 reject non-lo]/ensure: created Notice: /Stage[main]/Firewall::Pre/Firewall[002 accept established]/ensure: created Notice: /Stage[main]/Firewall::Pre/Firewall[003 allow outbound]/ensure: created Notice: /Stage[main]/Firewall::Pre/Firewall[004 allow icmp]/ensure: created Notice: /Stage[main]/Firewall::Pre/Firewall[005 Allow SSH]/ensure: created Notice: /Stage[main]/Firewall::Pre/Firewall[006 HTTP/HTTPS connections]/ensure: created Notice: /Stage[main]/Firewall::Post/Firewall[999 drop all]/ensure: created Info: Stage[main]: Unscheduling all events on Stage[main] Notice: Applied catalog in 2.16 seconds
Видим что у меня имеется ошибка, не может прочитать файл с паппет-сервера (не хватает прав), но все остальное — отработало отлично.
Проверяем iptables на паппет-агенте:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 /* 000 lo traffic */ REJECT all -- 0.0.0.0/0 127.0.0.0/8 /* 001 reject non-lo */ reject-with icmp-port-unreachable ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 /* 002 accept established */ state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 /* 004 allow icmp */ ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22 /* 005 Allow SSH */ ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 /* 006 HTTP/HTTPS connections */ DROP all -- 0.0.0.0/0 0.0.0.0/0 /* 999 drop all */ Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 /* 003 allow outbound */
Видим что правила применились!
Грейд джоб 😉
Сколько узлов может поддерживать Puppet Open Source и Puppet Enterprise?
Все это зависит от нескольких факторов:
- Сколько ядер у вашего puppetmaster-а?
- Насколько большие каталоги для каждого узла?
- Нужно ли применять все сразу, или можно их запланировать в разное время?
Если вы ищете точку отсчета, я могу сказать вам, что паппет-сервер с открытым исходным кодом сможет обрабатывать 1000+ узлов на 12 ядрах, но если время запуска puppet манифестов будет соответствующим образом распределено.
У меня все, статья «Установка Puppet в Unix/Linux» подошла к завершению.
«puppet cert list —all», там где «puppet cert list —all»