Установка Puppet в Unix/Linux

Установка 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?

Все это зависит от нескольких факторов:

  1. Сколько ядер у вашего puppetmaster-а?
  2. Насколько большие каталоги для каждого узла?
  3. Нужно ли применять все сразу, или можно их запланировать в разное время?

Если вы ищете точку отсчета, я могу сказать вам, что паппет-сервер с открытым исходным кодом сможет обрабатывать 1000+ узлов на 12 ядрах, но если время запуска puppet манифестов будет соответствующим образом распределено.

У меня все, статья «Установка Puppet в Unix/Linux» подошла к завершению.

One thought on “Установка Puppet в Unix/Linux

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.