Thank you for reading this post, don't forget to subscribe!
Puppet — кроссплатформенное клиент-серверное ПО, которое позволяет централизованно управлять конфигурацией ОС и утилит, которые установлены на разных серверах. Многие большие компании используют puppet для своих целей.
Узлы сети, управляемые с помощью Puppet, периодически опрашивают сервер, получают и применяют внесённые администратором изменения в конфигурацию. Конфигурация описывается на специальном декларативном предметно-ориентированном языке
Паппет терминология.
- Facts: Паппет агент на каждом узле отправляет данные о состоянии ноды ( которые называются фактами) на сервер с puppet-master-ом.
- Catalog: Сервер с паппет-мастером использует факт чтобы скомпилировать подробные данные о том, как должен быть сконфигурирован узел ( это так званый каталог) и отправить его обратно на паппет-агент. Паппет-агент вносит любые изменения в catalog. Puppet-agent может симулировать данные изменения (имеется опция — ‘—noop’) для того, чтобы провести тесты.
- Report: Каждый паппет-агент отправляет отчет на паппет-масте с указанием любых изменений, внесенных в конфигурацию.
- Report Collection: Открытое puppet API которе может быть использовано для отправки данных. Таким образом, инфраструктура может использоваться совместно с другими командами.
Особенности Puppet
- Разработан таким образом, что он предотвращает дублирование выполнение запущенных манифестов.
- Готовый к использованию инструмент.
- Мощный Framework.
- Упрощаете выполнение рутинных задач системного администратора.
- Помогает в управлении физическими и виртуальными устройствами, а также облаками.
У меня имеется:
- 192.168.1.150 puppet-server
- 192.168.1.16 puppet-agent
Puppet в репозиториях состоит из нескольких пакетов, puppet-сервер и puppet-клиент — это 2 основных пакета которые потребуются.
Паппет поддерживает 2 режима использования:
- Standalone Mode — это когда устанавливается на каждую из машин puppet-server и puppet-agent и он провиженит все дело на одной только ноде. Все манифесты, все настройки будет только на одном сервере. Можно запускать по cron.
- Master-Agent — это когда у вас имеется puppet-server и установленные puppet-agent-ы на других машинах. Puppet-агент периодически отправляет факты на puppetmaster и запрашивает каталог. Puppetmaster компилирует и возвращает каталог конкретного узла, используя источники информации, к которым он имеет доступ.
Установка Puppet в Unix/Linux
Можно подключить репозиторий EPEL — включить EPEL репозиторий на CentOS и потом, выполним поиск пакетов:
Смотрим какой тип ОС имеется в системе, для этого можно выполнить:
# uname -m
x86_64
И потом выбираем версию ОС….
CentOS 6:
rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
Устанавливаем сам puppet-server:
yum -y install puppet-server
/etc/sysconfig/puppet — микроконфиг. Рекомендуется раскомментировать для получения отдельных логов строчку
1 2 |
PUPPET_LOG=/var/<span class="hljs-built_in">log</span>/puppet/puppet.log |
/etc/puppet/environments — может использоваться для деления клиентов на группы, весьма неоднозначная технология, нужна, если узлов не меньше 30 и зачастую заменяется экзотической надстройкой R10K.
/etc/puppet/hieradata — используется для хранения, довольно интересная технология, требует отдельной статьи.
/etc/puppet/manifests/site.pp — основной конфиг запуска классов из модулей настройки клиентов.
/etc/puppet/modules — собственно сюда скачиваются/пишутся_свои модули для настройки клиентов, которые по сути представляют из себя набор классов (манифестов), написаных на DSL, похожем на Ruby. При желании можно даже делать вставки на чистом Ruby.
/var/lib/puppet — пока сюда не лезем, будет нужно для сертификатов.
/etc/puppet/puppet.conf — основной конфиг настройки сервера.
Добавляем в /etc/puppet/puppet.conf секция [main]:
1 2 3 4 5 6 7 8 9 10 |
confdir = /etc/puppet server = pmaster.test.net certname = pmaster.test.net environmentpath = <span class="hljs-variable">$confdir</span>/environments basemodulepath = <span class="hljs-variable">$confdir</span>/modules default_manifest = <span class="hljs-variable">$confdir</span>/manifests hiera_config = <span class="hljs-variable">$confdir</span>/hiera.yaml environment_timeout = unlimited dns_alt_names = pmaster.test.t,stage.test.net vardir=/var/lib/puppet |
dns_alt_names — здесь прописываются узлы, которые могут работать с сервером через сертификаты. Тем у кого сервера сидят за проксёй и они хотят тянуть модули с forgeapi.puppetlabs.com, полезно будет знать, что puppet пофиг на ваши системные http_proxy=proxy01.int:8080 и https_proxy=proxy02.int:8080 и придётся забить в конфиг доп секцию.
1 2 3 4 |
[user] http_proxy_host = proxy01.int http_proxy_port = 8080 |
Для проверки всех текущих параметров сервера есть полезная команда:
1 2 |
puppet config <span class="hljs-built_in">print</span> |
Причём даже демон перезагружать не надо, он всё время перечитывает свои конфиги.
Выставим ограничение по использованию RAM в puppet:
vim /etc/sysconfig/puppetmaster
Затем найдите строку JAVA_ARGS и используйте -Xms и -Xmx параметры , чтобы установить распределение памяти. Например, если вы хотите использовать 4 ГБ памяти, строка должна выглядеть так:
ЭТО НУЖНО ДЛЯ PUPPET 4 (насчет 5-го я не уверен), Т.К ИСПОЛЬЗУЕТСЯ JAVA ВНУТРИ PUPPET.
Данный сервер, написан на рубене, по этому — он тоже поставится (вместе с зависимостями).
Если вы не предполагаете использовать DNS, вы можете добавить записи в файл на сервере и клиенте. Открываем файл:
vim /etc/hosts
В файле /etc/hosts
добавляем запись (это важно – имя хоста должно быть доступно и назначено и серверу, и клиенту):
192.168.1.16 centos62 puppet-agent pagent.centos62
hostname => centos6
fqdn => centos6
Чтобы изменения вступили в силу, выполните:
Так же, можно прогнать тест:
# puppet agent --test --server=`hostname`
Добавляем в автозапуск:
1 |
# chkconfig puppetmaster on |
Проверяем:
1 |
# chkconfig --list | grep puppetmaster |
2 |
puppetmaster 0:off 1:off 2:on 3:on 4:on 5:on 6:off |
Как-то так.
Файлы и клиента и сервера хранятся в каталоге /etc/puppet
:
1 |
# ls -l /etc/puppet |
2 |
total 28 |
3 |
-rw-r--r--. 1 root root 4178 Jun 10 00:09 auth.conf |
4 |
drwxr-xr-x. 3 root root 4096 Jul 2 12:18 environments |
5 |
-rw-r--r--. 1 root root 1462 Jun 10 00:08 fileserver.conf |
6 |
drwxr-xr-x. 2 root root 4096 Jun 10 00:09 manifests |
7 |
drwxr-xr-x. 2 root root 4096 Jun 10 00:09 modules |
8 |
-rw-r--r--. 1 root root 853 Jun 10 00:08 puppet.conf |
Файлы fileserver.conf
и auth.conf
используются для настройки файлового сервера и аутентификации – мы их пока трогать не будем.
Каталог manifests
содержит в себе “манифесты”, которые являются файлами настройки для клиентов. Основной из них – файл site.pp
, который будет считываться мастером всегда, и его настройки будут применяться ко всем клиентам (если другое не указано в самом манифесте).
Добавляем правило iptables
Если используете iptables, то пропишем правило:
Добавляем в автозапуск:
Добавляем правило systemd
Посмотреть все текущие настройки можно выполнив следующую команду
puppet apply --configprint all
Для каждой опции, можно выводить значение — это можно использовать следующим образом:
Установка puppet-agent в CentOS/Fedora/RedHat
Puppet-agent должен быть установлен на сервер, которым будет управлять puppet-master (puppet-server).
Устанавливаем puppet-agent:
yum -y install puppet
или
yum -y install puppet-agent
На каждом клиенте Puppet добавьте запись о сервере + хостнейм для нод с клиентом:
192.168.1.16 centos62 puppet-agent pagent.centos62
Проверяем на puppet-анете имя хоста:
/etc/puppet/puppet.conf — основной конфиг.
На клиенте редактируем файл /etc/puppet/puppet.conf
и в блок [agent]
добавляем :
1 |
server = |
Тут важно замечание – во многих мануалах говорится про puppetcca
, puppetd
и т.п. – но в версии 3.0 они отсутствуют (первая колонка – старая команда, во второй – новая):
puppetmasterd | puppet master |
puppetd | puppet agent |
puppet | puppet apply |
puppetca | puppet cert |
ralsh | puppet resource |
puppetrun | puppet kick |
puppetqd | puppet queue |
filebucket | puppet filebucket |
puppetdoc | puppet doc |
pi | puppet describe |
/etc/init.d/puppet — демон клиента для автопроверок, не изменилось ли что на сервере. Мы будем пользоваться ком строкой.
/etc/sysconfig/puppet — микроконфиг. Приводим его к виду вроде:
1 2 3 4 5 |
PUPPET_SERVER=pmaster.centos6 PUPPET_PORT=8140 PUPPET_LOG=/var/<span class="hljs-built_in">log</span>/puppet/puppet.log PUPPET_EXTRA_OPTS=--waitforcert=500 </code> Добавляем в автозапуск: |
Следующий шаг – создание сертификата клиента, выполняем:
На сервере будет самоподписной и сгенерируется при запуске сервера. На клиенте делаем запрос на верификацию:
1 2 |
puppet agent --server pmaster.centos6 --waitforcert 60 --test --debug |
Здесь нас может поджидать первый камень типа «забыли про порт или сервис на сервере». Неявно вы увидите ошибку:
1 2 |
Error: Could not request certificate: No route to host - connect(2) |
Использовав ключ –debug, получите более подробное:
1 2 3 |
Debug: Creating new connection <span class="hljs-keyword">for</span> https://pmaster.test.net:8140 Error: Could not request certificate: No route to host - connect(2) |
Ну а если всё нормально то нечто вроде:
1 2 3 4 5 6 |
Info: Caching certificate <span class="hljs-keyword">for</span> ca Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml Info: Creating a new SSL certificate request <span class="hljs-keyword">for</span> stage.test.net Info: Certificate Request fingerprint (SHA256): 89:19:56:C4:76:0F:7F:C3:14:F3:D7:91:81:8C:A3:07:C5:55:AC:32:35:F5:93:6A:1B:17:DE:AC:EB:5D:DD:44 Info: Caching certificate <span class="hljs-keyword">for</span> ca Exiting; no certificate found and waitforcert is disabled |
puppet cert list --all
"centos62" (SHA256) 0C:80:58:DD:BF:12:1C:10:22:89:FD:D3:99:8D:C9:08:F0:D8:AC:90:CE:44:AF:05:D4:09:2F:E7:6D:DE:A2:4E
+ "pmaster.centos6" (SHA256) F7:F3:AD:FC:42:C4:CE:C3:2E:70:08:07:0E:BE:1A:66:80:2A:51:41:85:86:C5:FB:A6:FB:85:F1:C8:E9:0D:0A (alt names: "DNS:pagent.centos6.2", "DNS:pmaster.centos6")Если он без плюса, значит его надо подписать
puppet cert sign centos62
Итог должен появиться в /var/lib/puppet/ssl. Если что то пошло не так всё там стираем и повторяем заново. Собственно теперь у нас готовая конфигурация и можно посмотреть доступное народное творчество, или поискать что то для себя напрямую из командной строки:
Если необходимо удалить данный сертификат то
на клиенте:
rm -rf /var/lib/puppet/ssl
puppet node clean centos62
на мастере
puppet cert clean centos62
Проверим как работает:
Редактируем файл /etc/puppet/manifests/site.pp на сервере и изменим права:
1 |
file { "/etc/passwd": |
2 |
owner => "root", |
3 |
group => "bin", |
4 |
mode => 644, |
5 |
} |
на:
1 |
file { "/etc/passwd": |
2 |
owner => "root", |
3 |
group => "bin", |
4 |
mode => 777, |
5 |
} |
Сначала посмотрим на файл на клиенте сейчас:
1 |
# ls -l /etc/passwd |
2 |
-rw-r--r--. 1 root bin 1390 Jul 2 13:10 /etc/passwd |
Теперь – можно либо подождать 30 минут, пока агент сам запросит изменения, либо перезапустить его, либо настроить не меньший интервал запросов изменений от мастера.
Выберем последний вариант – редактируем файл puppet.conf
на клиенте, и устанавливаем в блоке [agent]
опцию:
1 |
runinterval = 10 |
Где 10 – количество секунд меду запросами.
Сохраняем, выходим, и видим на сервере в логе каждые 10 секунд сообщение:
[2018-05-23 12:03:36] - -> /production/node/centos62?fail_on_404=true&transaction_uuid=e75152b3-b524-4f0a-9e44-1daf332a2827
[2018-05-23 12:03:36] 192.168.1.16 - - [23/May/2018:12:03:36 EDT] "GET /production/file_metadatas/pluginfacts?ignore=.svn&ignore=CVS&ignore=.git&checksum_type=md5&recurse=true&links=manage HTTP/1.1" 200 283
[2018-05-23 12:03:36] - -> /production/file_metadatas/pluginfacts?ignore=.svn&ignore=CVS&ignore=.git&checksum_type=md5&recurse=true&links=manage
[2018-05-23 12:03:36] 192.168.1.16 - - [23/May/2018:12:03:36 EDT] "GET /production/file_metadatas/plugins?ignore=.svn&ignore=CVS&ignore=.git&checksum_type=md5&recurse=true&links=manage HTTP/1.1" 200 283
[2018-05-23 12:03:36] - -> /production/file_metadatas/plugins?ignore=.svn&ignore=CVS&ignore=.git&checksum_type=md5&recurse=true&links=manage
[2018-05-23 12:03:37] 192.168.1.16 - - [23/May/2018:12:03:37 EDT] "POST /production/catalog/centos62 HTTP/1.1" 200 807
[2018-05-23 12:03:37] - -> /production/catalog/centos62
[2018-05-23 12:03:38] 192.168.1.16 - - [23/May/2018:12:03:38 EDT] "PUT /production/report/centos62 HTTP/1.1" 200 9
[2018-05-23 12:03:38] - -> /production/report/centos62
на клиенте в логе:
Wed May 23 12:01:38 -0400 2018 /Stage[main]/Main/File[/etc/passwd]/group (notice): group changed 'root' to 'bin'
Wed May 23 12:01:38 -0400 2018 /Stage[main]/Main/File[/etc/passwd]/mode (notice): mode changed '0644' to '0777'
Wed May 23 12:01:38 -0400 2018 Puppet (notice): Finished catalog run in 0.05 seconds
Проверяем файл на клиенте:
-rwxrwxrwx 1 root bin 1.1K May 23 05:54 /etc/passwd
Всё работает.
Не забываем вернуть значение 644.
------------------------
Теория
-----------------------
puppet.conf
Может содержать следующие настройки:
- node_name — определяет, как мастер будет идентифицировать клиента для использования в манифестах, а также определяет переменные hostname, fqdn и domain. Возможные значения cert (использует значение certname) и facter (использует hostname клиента). По умолчанию : cert.
- manifest — входной манифест который открывает puppet. По умолчанию: $manifestdir/site.pp.
- manifestdir — папка, где мастер ищет манифесты. По умолчанию: $confdir/manifests.
- runinterval — количество секунд, через которое клиент будет опрашивать мастера. По умолчанию: 1800 (30 минут).
- puppetport — порт, по которому происходит обмен. По умолчанию: 8139.
- puppetdlockfile — адрес, по которому размещается lock — файл, запрещающий запуск нескольких копий puppet на клиенте. По умолчанию: $statedir/puppetdlock.
- templatedir — папка, где мастер ищет шаблоны.
- modulepath — папка, где мастер ищет модули.
Консольные команды
- puppet apply --configprint modulepath — выводит значение конкретной настройки puppet.conf (в данном случае modulepath), если ввести --configprint all можно получить полный текущий конфиг. (И сохранить перед тем как начать что-то править…)
- puppet resource <type> <id> — позволяет получить описание ресурса определённого типа <type> с идентификатором <id> сразу на декларативном языке puppet. Например puppet resource user root. Тип ресурса user а его идентификатор (адрес) root
- puppet describe -s <type> — позволяет получить описание типа, имеющихся для него команд.
- puppet apply <my_test_manifest.pp> — выполняет указанный манифест.
- puppet apply -e «include undeclaredclass» — выполнит незадекларированный класс undeclaredclass, находящийся в одном из написанных вами модулей (естественно, расположенном в папке $modulepath).
Манифесты
Их иногда называют рецептами, представляют собой текстовые файлы с расширением .pp (По умолчанию выполняется $confdir/manifests/site.pp). В манифесте могут и должны содержаться:
- Классы (class)
- Узлы (node)
- Ресурсы (то есть типы file, user и др.)
- Ссылки на другие манифесты (import)
Встроенные переменные
Встроенные переменные становятся доступными благодаря утилите facter, устанавливаемой вместе с puppet, которая берёт информацию из системы. Если набрать в командной строке facter, то можно получить полный список доступных переменных. Вот некоторые из них:
- $operatingsystem — операционная система.
- $fqdn — полное доменное имя.
- $hostname — имя хоста.
- $ipaddress — IP адрес.
- $osfamily — семейство операционных систем.
- $is_virtual — запущена ли ОС в виртуальной машине.
Гид по языку
- Условие
1 2 3 4 5 6 7 8 9 10 |
<span class="k">if</span> <span class="n">condition</span> <span class="p">{</span> <span class="n">block</span> <span class="n">of</span> <span class="n">code</span> <span class="p">}</span> <span class="k">elsif</span> <span class="n">condition</span> <span class="p">{</span> <span class="n">block</span> <span class="n">of</span> <span class="n">code</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">block</span> <span class="n">of</span> <span class="n">code</span> <span class="p">}</span> |
- Перечисление
1 2 3 4 5 6 |
<span class="k">case</span> <span class="vg">$operatingsystem</span> <span class="p">{</span> <span class="n">centos</span><span class="p">,</span> <span class="ss">redhat</span><span class="p">:</span> <span class="p">{</span> <span class="vg">$apache</span> <span class="o">=</span> <span class="s2">"httpd"</span> <span class="p">}</span> <span class="n">debian</span><span class="p">,</span> <span class="ss">ubuntu</span><span class="p">:</span> <span class="p">{</span> <span class="vg">$apache</span> <span class="o">=</span> <span class="s2">"apache2"</span> <span class="p">}</span> <span class="ss">default</span><span class="p">:</span> <span class="p">{</span> <span class="nb">fail</span><span class="p">(</span><span class="s2">"Unrecognized operating system for webserver"</span><span class="p">)</span> <span class="p">}</span> <span class="p">}</span> |
- Выбор
1 2 3 4 5 6 7 |
<span class="vg">$apache</span> <span class="o">=</span> <span class="vg">$operatingsystem</span> <span class="p">?</span> <span class="p">{</span> <span class="n">centos</span> <span class="o">=></span> <span class="s1">'httpd'</span><span class="p">,</span> <span class="n">redhat</span> <span class="o">=></span> <span class="s1">'httpd'</span><span class="p">,</span> <span class="sr">/(?i)(ubuntu|debian)/</span> <span class="o">=></span> <span class="s2">"apache2"</span><span class="p">,</span> <span class="n">default</span> <span class="o">=></span> <span class="k">undef</span><span class="p">,</span> <span class="p">}</span> |
- Атрибуты по умолчанию
1 2 3 |
<span class="no">Exec</span> <span class="p">{</span> <span class="n">path</span> <span class="o">=></span> <span class="s1">'/usr/bin:/bin:/usr/sbin:/sbin'</span> <span class="p">}</span> <span class="nb">exec</span> <span class="p">{</span> <span class="s1">'echo this works'</span><span class="p">:</span> <span class="p">}</span> |
Классы
- Наследование классов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="k">class</span> <span class="n">unix</span> <span class="p">{</span> <span class="n">file</span> <span class="p">{</span> <span class="s1">'/etc/passwd'</span><span class="p">:</span> <span class="n">owner</span> <span class="o">=></span> <span class="s1">'root'</span><span class="p">,</span> <span class="n">group</span> <span class="o">=></span> <span class="s1">'root'</span><span class="p">,</span> <span class="n">mode</span> <span class="o">=></span> <span class="s1">'0644'</span><span class="p">,</span> <span class="p">}</span> <span class="n">file</span> <span class="p">{</span> <span class="s1">'/etc/shadow'</span><span class="p">:</span> <span class="n">owner</span> <span class="o">=></span> <span class="s1">'root'</span><span class="p">,</span> <span class="n">group</span> <span class="o">=></span> <span class="s1">'root'</span><span class="p">,</span> <span class="n">mode</span> <span class="o">=></span> <span class="s1">'0440'</span><span class="p">,</span> <span class="p">}</span> <span class="p">}</span> <span class="k">class</span> <span class="n">freebsd</span> <span class="n">inherits</span> <span class="n">unix</span> <span class="p">{</span> <span class="no">File</span><span class="o">[</span><span class="s1">'/etc/passwd'</span><span class="p">,</span> <span class="s1">'/etc/shadow'</span><span class="o">]</span> <span class="p">{</span> <span class="n">group</span> <span class="o">=></span> <span class="s1">'wheel'</span><span class="p">,</span> <span class="n">owner</span> <span class="o">=></span> <span class="k">undef</span> <span class="p">}</span> <span class="p">}</span> |
При вызове класса freebsd для файлов атрибут group изменится на wheel, а вот атрибут owner не будет проверяться вообще. Значение атрибутов можно не заменять а добавлять:
1 2 3 4 5 6 7 8 |
<span class="k">class</span> <span class="n">apache</span> <span class="p">{</span> <span class="n">service</span> <span class="p">{</span> <span class="s1">'apache'</span><span class="p">:</span> <span class="nb">require</span> <span class="o">=></span> <span class="no">Package</span><span class="o">[</span><span class="s1">'httpd'</span><span class="o">]</span> <span class="p">}</span> <span class="p">}</span> <span class="k">class</span> <span class="n">apache</span><span class="o">-</span><span class="n">ssl</span> <span class="n">inherits</span> <span class="n">apache</span> <span class="p">{</span> <span class="c1"># host certificate is required for SSL to function</span> <span class="no">Service</span><span class="o">[</span><span class="s1">'apache'</span><span class="o">]</span> <span class="p">{</span> <span class="nb">require</span> <span class="o">+></span> <span class="no">File</span><span class="o">[</span><span class="s1">'apache.pem'</span><span class="o">]</span> <span class="p">}</span> <span class="p">}</span> |
- Зависимости между классами
1 2 3 4 |
<span class="k">class</span> <span class="n">apache</span> <span class="p">{</span> <span class="n">service</span> <span class="p">{</span> <span class="s1">'apache'</span><span class="p">:</span> <span class="nb">require</span> <span class="o">=></span> <span class="no">Class</span><span class="o">[</span><span class="s1">'squid'</span><span class="o">]</span> <span class="p">}</span> <span class="p">}</span> |
Но таких конструкций лучше избегать, так как это может привести к циклам. Следующий пример позволяет этого избежать и сохраняет правило, когда один ресурс объявляется только один раз:
1 2 3 4 5 6 7 8 |
<span class="k">class</span> <span class="n">myservice</span> <span class="p">{</span> <span class="n">service</span> <span class="p">{</span> <span class="ss">foo</span><span class="p">:</span> <span class="k">ensure</span> <span class="o">=></span> <span class="n">running</span> <span class="p">}</span> <span class="p">}</span> <span class="k">class</span> <span class="n">otherstuff</span> <span class="p">{</span> <span class="kp">include</span> <span class="n">myservice</span> <span class="n">file</span> <span class="p">{</span> <span class="s1">'/foo'</span><span class="p">:</span> <span class="n">notify</span> <span class="o">=></span> <span class="no">Service</span><span class="o">[</span><span class="n">foo</span><span class="o">]</span> <span class="p">}</span> <span class="p">}</span> |
- Параметризированные классы
1 2 3 4 5 6 7 |
<span class="k">class</span> <span class="n">apache</span><span class="p">(</span><span class="vg">$version</span> <span class="p">,</span> <span class="vg">$home</span> <span class="o">=</span> <span class="s1">'/var/www'</span><span class="p">)</span> <span class="p">{</span> <span class="c1"># Содержимое класса</span> <span class="p">}</span> <span class="n">node</span> <span class="n">webserver</span> <span class="p">{</span> <span class="k">class</span> <span class="p">{</span> <span class="s1">'apache'</span><span class="p">:</span> <span class="n">version</span> <span class="o">=></span> <span class="s1">'1.3.13'</span> <span class="p">}</span> <span class="p">}</span> |
Основные типы
Общие атрибуты
- before — определяет, что данный ресурс должен отработать до какого-то другого. Задаётся в виде метапараметра: Type['title']. Можно задавать массив метапараметров [Type1['title1'],Type2['title2']]. В метапараметрах (или ссылках на ресурсы) тип ресурса обязательно указывается с большой буквы.
- notify — создаёт отношение, аналогичное before, но определяет, что следующий ресурс отработает только после того, как данный изменится. Задаётся метапараметром.
- require — определяет, что данный ресурс должен отработать только после другого. Задаётся метапараметром.
- subscribe — создаёт отношение, аналогичное require, но определяет, что данный ресурс должен отработать только после того, как ресурс на который подписались изменится. Задаётся метапараметром.
- schedule — определяет расписание (интервал) для запуска данного ресурса. См. тип shedule.
- noop — определяет, должен ли отработать данный ресурс. Равно true (по умолчанию) или false.
notify
Записывает определённое сообщение в лог. Не выводит никакой информации пользователю.
- name — Тэг на Ваше усмотрение, задаёт имя сообщения.
- message — Текст, который будет отправлен в лог. Если не задан, puppet по умолчанию считывает из заголовка ресурса.
- withpath — Показывать или нет полный путь к объекту, если включено, то в логе будет 2 строки: само сообщение и ещё полный путь по вложениям откуда оно запускалось. Равно true или false (в мануалах пишут что по умолчанию равно false, но на практике наблюдается обратное).
file
Позволяет управлять файлами и директориями.
- ensure — проверка на существование файла и его тип. Имеет значения present (существует), absent (отсутствует), file (является файлом), directory (является директорией), link (является ссылкой).
- path — Полный адрес к файлу. Если не задан, puppet по умолчанию считывает из заголовка ресурса.
- source — Откуда качать файл. Это адрес на мастере puppet:/// или локальный.
- mode — Права на файл (например, 0740). Должны задаваться числовым значением. Работает так же и с директориями.
- target — Символьная ссылка (когда задано ensure => link).
- recurse — Определяет, обрабатывать директорию рекурсивно с подкаталогами и всем содержимым (когда задано ensure => directory). Равно true, false или remote. Remote — указывает, что надо перебрать рекурсивно каталог на сервере и обработать на клиенте все найденные на сервере файлы. Рекурсивно на клиенте каталог обрабатываться не будет.
- recurselimit — Определяет, как глубоко уходить в подкаталоги. Может принимать значения /^[0-9]+$/ (натуральные числа).
- owner — Пользователь-владелец файла, задаётся по имени или UID.
- group — Группа-владелец файла, задаётся по имени или GID.
- content — Задаёт строку, устанавливаемую в качестве содержимого файла. Наиболее полезны в работе с шаблонами, но вы также можете использовать функции файлового вывода (консольные команды).
- purge — Удалять ли файлы из директории которых нет на мастере у клиента (работает когда recurse => true). Равно true (в директории будут только те файлы что есть на мастере, остальные удалятся) или false (синхронизируются те файлы, что есть на сервере, остальные останутся без изменений).
- mtime — проверка на время последнего изменения файла.
- ctime — проверка на время последнего изменения владельца или прав доступа к файлу.
- backup — Нужно ли делать бэкап файла перед его заменой. Равно false (не надо делать резервной копии), .ваш_текст_начинающийся_с_точки (сделает резервную копию в том же месте где и был файл добавлением к нему суффикса .ваш_текст_начинающийся_с_точки), ваш_текст_без_точки_вначале (сархивирует в filebucket с именем ваш_текст_без_точки_вначале).
- force — позволяет выполнить операцию даже если она уничтожит одну или несколько директорий. Требуется использовать: совместно с параметром purge (будут также удаляться и поддиректории), когда необходимо заменить директорию файлом или ссылкой, и когда удаляется директория (ensure => absent). Равно true или false.
- checksum — Алгоритм подсчета контрольной суммы при определении изменения содержимого файла.
Значение по умолчанию: md5.
Возможные значения: md5, md5lite, mtime, ctime, none. - ignore — Параметр определяющий игнорируемые файлы при рекурсивной обработке каталога.
Используется стандартный встроенный движок ruby. К примеру полностью поддерживаются метасимволы вроде [a-z]*.
Совпадения исползующие вхождение в подкаталоги, вроде */*, игнорируются (**в оригинале: Matches that would descend into the directory structure are ignored, e.g., */*). - links — Как обрабатывать символические ссылки во время обработки файлов.
Возможные значения:- follow — будет скопирован указанный по ссылке файл
- manage — будет скопирована сама ссылка
- ignore — ссылка будет проигнорирована
- provider — Конкретный бэкенд используемый этим ресурсом. Скорее всего вам не придется использовать этот параметр, т.к. puppet определит этот параметр в соответствии с платформой
Возможные значения: posix, windows - replace — Заменить ли файл или символическую ссылку, которая уже существует в локальной системе, но содержание которого не соответствует тому, что источник или содержание атрибут определяет.
Установка этого значения в false позволяет инициализировать файловые ресурсы без перезаписи при изменениях в будущем.
Обратите внимание, что это влияет только на содержимое; Puppet будет по-прежнему управлять владельца и права.
Значение по умолчанию true.
Возможные значения true, false, yes, no. - selinux_ignore_defaults — If this is set then Puppet will not ask SELinux (via matchpathcon) to supply defaults for the SELinux attributes (seluser, selrole, seltype, and selrange). In general, you should leave this set at its default and only set it to true when you need Puppet to not try to fix SELinux labels automatically. Valid values are true, false.
- selrange — (Property: This attribute represents concrete state on the target system.) What the SELinux range component of the context of the file should be. Any valid SELinux range component is accepted. For example s0 or SystemHigh. If not specified it defaults to the value returned by matchpathcon for the file, if any exists. Only valid on systems with SELinux support enabled and that have support for MCS (Multi-Category Security).
- selrole — (Property: This attribute represents concrete state on the target system.) What the SELinux role component of the context of the file should be. Any valid SELinux role component is accepted. For example role_r. If not specified it defaults to the value returned by matchpathcon for the file, if any exists. Only valid on systems with SELinux support enabled.
- seltype — (Property: This attribute represents concrete state on the target system.) What the SELinux type component of the context of the file should be. Any valid SELinux type component is accepted. For example tmp_t. If not specified it defaults to the value returned by matchpathcon for the file, if any exists. Only valid on systems with SELinux support enabled.
- seluser — (Property: This attribute represents concrete state on the target system.) What the SELinux user component of the context of the file should be. Any valid SELinux user component is accepted. For example user_u. If not specified it defaults to the value returned by matchpathcon for the file, if any exists. Only valid on systems with SELinux support enabled.
- show_diff — Отображать ли различия при изменении файла. Значение по умолчанию true. Этот параметр полезен для файлов включающих пароли, и другие секретные данные, которые в противном случае были бы включены в логи Puppet, и другие небезопасные выводы.
Если глобальный параметр `show_diff` равен false, то различия не будут отображаться даже если далее он будет объявлен как true.
Возможные значения true, false, yes, no. - source — Источник, из которого будут копироваться данные в локальную систему. Значением могут быть как URI к удаленным файлам, так и полные пути в локальной системе (в т.ч. и в подключенных NFS и Samba шарах)
Этот атрибут является взаимоисключающим с content и target.
Доступные URI могут быть puppet and file.
Puppet URI будут брать файлы из встроенного в puppet файлового сервера, и как правило имеют формат:
puppet:///modules/name_of_module/filename
При этом будут взяты файлы из модуля на puppet-master-е(или локального модуля, при использовании pupper apply).
Предположив, что modulepath ссылается на /etc/puppetlabs/puppet/modules, в приведенном выше примере получим полный адрес
/etc/puppetlabs/puppet/modules/name_of_module/files/filename.
В отличие от content, атрибут source может быть использован для рекурсивного копирования директории, если атрибут recurse выставлен как true или remote.
Если директория-источник сдержит символическую ссылку, используйте атрибут links чтоб указать - нужно ли воссоздать ссылку, или следовать за ней.
Возможно указать несколько источников в виде массива. В этом случае puppet будет использовать первый существующий источник. Подобное может понадобиться для использования различных файлов на разных системах :
1 2 3 4 5 6 7 8 |
file { "/etc/nfs.conf": source => [ "puppet:///modules/nfs/conf.$host", "puppet:///modules/nfs/conf.$operatingsystem", "puppet:///modules/nfs/conf" ] } |
- source_permissions — Как puppet должен скопировать права, владельца и группу, оригинального source целевому file, когда эти значения явно не указаны соответствующими атрибутами. (Во всех случаях явные разрешения будут иметь приоритет.)
Возможные значения:- use (the default) заставляет Puppet применять владельца, группу и разрешения source на все обрабатываемые файлы.
- use_when_creating задавать разрешения в соответствии с sourceтолько при создании файлов; права уже существующих файлов изменяться не будут.
- ignore не наследовать права от source при обработке файлов. При создании новых файлов без явных разрешений, поведение при получении разрешений будут зависеть от конкретной платформы. На POSIX, Puppet будет использовать значение umask пользователя, от которого он запускается. На Windows, Puppet будет использовать DACL по умолчанию ассоциированный с пользователем от которого он запускается.
- sourceselect — Значение по умолчанию - first.
При рекурсивном копировании директорий, в случае если источников несколько - по умолчанию копируются файли из первого доступного источника. Если этому параметру задать значение all, то копироваться будут файлы из всех доступных источников.
Если указанный файл существует в более чем одного источника, будет использоваться версия из самого раннего источника в списке.
Доступные значения first, all. - type — (Property: This attribute represents concrete state on the target system.)
A read-only state to check the file type.
package
В зависимости от системы клиента, установщик пакетов выбирается автоматически и имеет определённые свойства, полное описание на сайте docs.puppetlabs.com(англ.).
- name — имя пакета. Если не задан, puppet по умолчанию считывает из заголовка ресурса.
- ensure — состояние данного пакета, равно present (или installed, то есть пакет установлен), absent (отсутствует), latest (установлен и является последней версией), purged, held (только для некоторых установщиков пакетов).
- provider — можно вручную указать установщика пакетов из возможных aix, appdmg, apple, apt, aptitude, aptrpm, blastwave, dpkg, fink, freebsd, gem, hpux, macports, msi, nim, openbsd, pacman, pip, pkg, pkgdmg, pkgutil, portage, ports, portupgrade, rpm, rug, sun, sunfreeware, up2date, urpmi, yum (по умолчанию для operatingsystem == fedora, centos, redhat), zypper.
- source — дополнительно можно указать где взять пакет, это может быть URL или как в управлении файлами адрес puppet:///.
yumrepo
Позволяет управлять подключенными репозиториями, посредством изменения /etc/yum.conf. Большинство параметров аналогичны man yum.conf.
- baseurl — URL данного репозитория. Значение absent удалит данные репозиторий из файла полностью. Возможные значения absent и по маске /.*/.
- cost — cтоимость данного репозитория. Значение absent удалит данные репозиторий из файла полностью. Возможные значения absent и по маске /\d+/.
- descr
- enabled
- enablegroups
- exclude
- failovermethod
- gpgcheck
- gpgkey
- http_caching
- include
- includepkgs
- keepalive
- metadata_expire
- mirrorlist
- name
- priority
- protect
- proxy
- proxy_password
- proxy_username
- timeout
service
Позволяет управлять системными службами.
- enable — включена ли служба на автозагрузку, равно true, false, manual.
- ensure — текущее состояние, равно stopped (или false), running (или true).
- start, stop, restart, status — позволяет задать соответственно команды на старт, остановку, перезапуск и проверку статуса вручную. Заданные команды будут использоваться при изменении статуса с помощью команды ensure. Для атрибута statusкоманда должна возвращать 0 если служба запущена и работает без ошибок, и возвращать ненулевое значение в остальных случаях.
- binary — путь к службе (демону). Используется только в системах, которые не поддерживают init скрипт.
exec
Позволяет выполнять консольные команды, скрипты непосредственно при запуске puppet.
- command — команда для запуска. Если опущена, равна заголовку. Адрес команд должен быть задан полностью, если не прописаны пути для поиска в атрибуте path.
- path — пути для поиска команд. Можно задать сразу несколько разделяя их двоеточием ':'. Чтобы не указывать этот параметр у каждого ресурса exec, можно задать этот параметр по умолчанию в самом начале манифеста, например, так: Exec { path => '/usr/bin:/bin:/usr/sbin:/sbin' }.
- cwd — текущая директория (переменная окружения $PWD в bash). Если директория не существует, команда не запустится.
- creates — файл, который создаёт команда. Если атрибут задан, то команда не запустится, если файл существует.
- environment — любые другие переменные окружения, которые необходимя для запуска команды. Имеет преимущество над арибутом path, то есть данную переменную можно переопределить.
- group, user — группа и пользователь с правами которых выполнять данную команду.
- logoutput — включать ли вывод команды в лог, равно true, false и on_failure (только в случае выхода с ошибкой).
- onlyif — задаёт проверочную команду. Основная команда (атрибут command) будет выполнена, только если эта команда выполнится без ошибок (код выхода будет 0), например:
1 2 3 4 5 |
<span class="nb">exec</span> <span class="p">{</span> <span class="s2">"logrotate"</span><span class="p">:</span> <span class="n">path</span> <span class="o">=></span> <span class="s2">"/usr/bin:/usr/sbin:/bin"</span><span class="p">,</span> <span class="n">onlyif</span> <span class="o">=></span> <span class="s2">"test `du /var/log/messages | cut -f1` -gt 100000"</span> <span class="p">}</span> |
При этом onlyif может проверять массив команд и выполнить основную команду только тогда, когда все команды массива выполнятся:
1 2 |
<span class="n">onlyif</span> <span class="o">=></span> <span class="o">[</span><span class="s2">"test -f /tmp/file1"</span><span class="p">,</span> <span class="s2">"test -f /tmp/file2"</span><span class="o">]</span> |
cron
Позволяет управлять планировщиком cron в Linux. К сожалению, удалить или изменить созданные вами вручную задания не сможет, так как определяет свои задания по вставляемому перед ними комментарию.
- command — команда, которую будет выполнять cron.
- ensure — управляет наличием задания, равно present или absent.
- hour — час, равно от 0 до 23. Время здесь и далее в типе cron может быть задано как '2', ['2-4'], ['2,4'], '*/2' (последнее если только ваш cron поддерживает подобное указание). По умолчанию равно *.
- minute — минута, равно от 0 до 59.
- month — месяц, равно от 1 до 12 или от january до december.
- weekday — день недели, равно от 0 до 7 (0 и 7 — это воскресенье) или от monday до sunday.
- name — имя задания. Если не задан, puppet по умолчанию считывает из заголовка ресурса.
- user — пользователь, в задания которого оно будет включено.
schedule
Определяет расписания отработки ресурсов. К ресурсу расписание может быть присвоено с помощью одноименного параметра (schedule) В настоящее время, расписания могут использоваться только для того, чтобы предотвратить применение ресурса. Они не позволяют выполняться ресурсу вне заданных рамок и не могут назначить время когда ресурс будет запущен (для этого необходимо ипользовать scheduled_task или cron).
Каждый раз, когда puppet отрабатывает манифесты, она проверяет, попадает ли текущий момент времени в указанное расписание. Если попадает, то ресурс отработает, иначе будет просто пропущен. При этом puppet НЕ создаст себе никакого задания отработать ресурс в будущем. То есть если создать расписание «Х» скажем ежедневно с 12:20 до 12:30, а по умолчанию puppet применяет конфигурацию раз в 30 минут, а компьютер был включен в 12:10… то следующий раз puppet отработает в 12:40 и все ресурсы, которым было назначено расписание «Х», просто не сработают. Или puppet будет отрабатывать какой-нибудь ресурс продолжительное время (загружать файлы или т. п.) с 12:15 по 12:35, и данное расписание тоже «выпадет» и может вообще никогда не сработает.
Поэтому, лучше использовать широкие расписания… (с интервалом в несколько часов). Например, чтобы запускать задание 1 раз в сутки между 2 и 4 часами утра надо задать следующее расписание:
1 2 3 4 5 6 |
schedule <span class="o">{</span> <span class="s1">'maint'</span>: <span class="nv">range</span> <span class="o">=</span>> <span class="s2">"2 - 4"</span>, <span class="nv">period</span> <span class="o">=</span>> daily, <span class="nv">repeat</span> <span class="o">=</span>> <span class="m">1</span>, <span class="o">}</span> |
- period — Период повторения. Равно hourly, daily, weekly, monthly, never (никогда, то есть параметр repeat задаст сколько всего раз выполнится данный ресурс).
- periodmatch — Конкретизирует параметр period. Равно number (когда учитываются количество срабатываний в течение определённого период, например, в час) или distance (когда учитывается срабатывание через определённый период).
- range — Интервал времени суток, в который действует расписание. Задаётся как «HH:MM:SS — HH:MM:SS» (кавычки тоже нужны), минуты и секунды могут быть опущены.
- repeat — Как часто срабатывать в указанный период. Должно задаваться целым числом. По умолчанию: 1.
user
Позволяет управлять пользователями.
- name — Если не задан, puppet по умолчанию считывает из заголовка ресурса.
- uid — UID пользователя. Должен задаваться цифрой, если опущено, то задаётся автоматически (или остаётся без изменений, если пользователь уже существует).
- ensure — проверка статуса пользователя, равно present (существует), absent (отсутствует), role.
- gid — Основная группа пользователя. Задаётся по имени или GID.
- groups — Массив дополнительных групп пользователя, через запятую. !!!Не надо включать группу, заданную как gid.
- home — Домашняя директория пользователя.
- shell — Оболочка пользователя (например, /bin/bash)
- managehome — Создавать ли домашнюю директорию при создании пользователя; Если не указано true - вам придется создавать ее вручную. true или false
group
Позволяет управлять группами пользователей.
- name — Если не задан, puppet по умолчанию считывает из заголовка ресурса.
- gid — GID группы. Должен задаваться цифрой, если опущено, то задаётся автоматически (или остаётся без изменений, если группа уже существует).
- ensure — проверка статуса группы, равно present (существует), absent (отсутствует).
Модули
Модули — это возможность использовать классы и функции в puppet. Модуль — это всего лишь директория с предопреденённой структурой каталогов и файлов. Выглядит структура модуля примерно так: {имя_модуля}/
1 2 3 4 5 6 7 8 9 10 11 |
files/ - содержит различные файлы lib/ - содержит плагины, например, особые переменные (facts) или типы ресурсов (может вы создадите свой file_yours тип) manifests/ - хранит все манифесты init.pp - должен быть обязательно {класс1}.pp {определяемый_тип}.pp {класс1}/ {под_класс1}.pp {под_класс2}.pp templates/ - содержит используемые шаблоны "*.erb" tests/ |
Обращение в коде puppet к классам будет выглядеть как:
1 2 3 4 |
<span class="err">имя</span><span class="n">_модуля</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span> <span class="err">имя</span><span class="n">_модуля</span><span class="o">::</span><span class="err">класс</span><span class="mi">1</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span> <span class="err">имя</span><span class="n">_модуля</span><span class="o">::</span><span class="err">класс</span><span class="mi">1</span><span class="o">::</span><span class="err">под</span><span class="n">_класс1</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span> |
Для того, чтобы модуль вообще заработал достаточно иметь папку с именем модуля, папку с манифестами и начальным манифестом init.pp.
По аналогии выстраиваем под_под_классы и под_под_…под_классы, пока не надоест.
Требуется, чтобы в каждом из файлов «класс1» … «под_класс1» был один и только один класс с соответствующим именем: «имя_модуля::класс1» … «имя_модуля::класс1::под_класс1». При этом файл init.pp должен содержать класс с именем «имя_модуля».
Получить доступ к файлам модуля можно, например, по адресу puppet:///modules/имя_модуля/.
Из директории lib можно запускать исполняемые файлы с Ruby-кодом, чтобы расширить возможности Puppet и Facter (поставщика переменных).
Environments
Окружения (environments) нужны для полного разделения конфигураций. У каждого окружения свои модули и манифесты. Это можно сравнить с использованием разных серверов puppet master.
История
- До версии 3.5 для указания окружений использовались только переменные manifest и modulepath («config file environments», в противоположность «directory environments», которые появились в версии 3.5)
- С версии 3.6 «config file environments» устарели
- В версии 3.7 «directory environments» включены по умолчанию в Puppet Enterprise, но не в Open Source
- С версии 4.0 в случае неиспользования окружений будет выдаваться предупреждение.
Если не указано, с версии 4.0 будет использоваться окружение production.
Именование
Имя окружения должно состоять из строчных букв, цифр и подчёркивания, начинаться с буквы. Нельзя использовать main, master, agent, user . Пример имён окружений: production и testing.
Подключение
В версиях 3.5, 3.6, 3.7 Open Source, 3.8 для использования «directory environments» прописываем в секцию [main] или [master] файла /etc/puppet/puppet.conf:
1 2 |
environmentpath = $confdir/environments |
В более новых версиях указывать ничего не нужно.
В конфигурации агента (секция [agent] в файле /etc/puppet/puppet.conf) надо указать, какое окружение он будет использовать, например:
1 2 |
environment = testing |
Использование
После подключения, используются манифесты из каталога окружения, например, /etc/puppet/environments/production/manifests/.
В манифестах можно использовать переменную $environment с именем текущего окружения.
___________________________________________________________
-----------------------------------------------------------------------------------------------------
Настройка 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 запросами.
Перезапускаем клиент:
Можно посмотреть некоторые пути к конфигам следующим образом:
/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:
Где, puppet-agent- это название ноды.
Puppet-master теперь может связываться и управлять узлом, которому принадлежит подписанный сертификат.
Если вы хотите подписать все текущие запросы, используйте опцию -all, например:
PS: Когда сервер удаляет уже подписанный сертификат для агента, вы должны удалить сертификаты из паппет-агента следующим образом:
Чтобы просмотреть все запросы, подписанные и неподписанные, выполните следующую команду:
Просмотрите отпечаток сертфиката клиента
Можно посмотреть некоторые пути к конфигам следующим образом:
или
У меня — /etc/puppetlabs/puppet/ и в этой директории, открываем (создаем) файл:
И после чего, все будет выполнятся в автоматическом режиме.
Настройка hiera на puppet-server-е
Прежде всего, я бы рекомендовал, — настроить хиеру (нужна чтобы определять переменные), для этого, — открываем:
Создаем символическую ссылку:
и прописываем:
И смотрим что вышло:
Или:
Видим что работает все.
Работа с Puppet в Unix/Linux
Для начала, можно создать простой манифест, для этого создаем файл (на стороне сервера с паппет):
Теперь сохраните и выйдите. Вы можете либо дождаться, когда агент автоматически проведет проверку с мастером, либо вы можете запустить команду (на стороне клиента):
Видим что паппет-агент отработал манифест который создали.
PS: Для дебага, используйте «--debug» опцию:
И вывод у меня будет следующим:
Если вы хотите запускать манифест только для некоторых нод, то стоит определить узел в манифесте. Открываем:
vim /etc/puppetlabs/code/environments/production/manifests/site.pp
и прописываем:
Так же, можно выполнить манифест руками, для этого служит команда:
Добавление модулей
ПРИМЕР 1 — Добавление ограниченного пользователя
Можно ограничить использования puppet по пользователю, для этого на puppetmaster-е (паппет сервере), создадим папку для модуля и перейдем в нее:
Создайте следующие каталоги, которые необходимы для функционирования модуля:
Где:
- examples — Директория для тестирования модуля локально.
- files — Папка, которая содержит любые статические файлы, которые могут потребоваться для отредактирования или добавления.
- manifests — Фолдер, в котором содержится фактический puppet код для модуля (т.е манифест действий).
- templates — Содержит любые не статические файлы, которые могут потребоваться.
Перейдите в каталог manifests и создайте свой первый класс под названием init.pp. Все модули требуют, чтобы файл init.pp использовался в качестве основного файла определения модуля:
И вставляем в него:
Примите во внимание, vagrant — это пользователь на puppet-server-е, который уже имеется в системе. И, password — это хеш от пароля (для пользователя vagrant) и его можно получить, выполнив:
Создаем еще один файл:
ПРИМЕР 2 — Редактирование SSH настроек
Копируем конфиг-файл:
Открываем файл:
И добавляем в него:
Должно выйти, что-то типа:
Сново, проверяем валидацию:
Выполняем тест:
Применяем:
ПРИМЕР 3 — Добавление и настройка IPTABLES ===-
В этом разделе я покажу как можно настраивать правила брандмауэра с помощью iptables. Однако по умолчанию эти правила не будут сохраняться при перезагрузке. Чтобы этого избежать, перед тем, как продолжить, установите соответствующий пакет на каждом узле (puppetmaster- е, puppet-агенте):
Для Debian/Ubuntu:
Идем дальше, нужно установить модуль на puppetmaster-е, для этого служит следующая команда:
Вывод говорит что модуль установился в /etc/puppetlabs/code/environments/production/modules/firewall директорию, давайте перейдем в нее:
После этого, создаем файл:
И вставляем в него:
В этой директории, создаем еще один файл:
И прописываем в него:
Данные правила будут применяться в фаэрволе.
Проверим валидность:
Создаем еще файл для тестирования:
Прописываем в него:
Валидируем:
Смотрим что получилось:
Вроде бы все то, что прописывали в правилах — уже имеется.
Но это же я настраивал все на паппет-сервере, чтобы добавить модуль\манифест для нод, нужно кое-что прописать.
Открываем файл:
И прописываем:
Запускаем на паппет-агенте манифет:
Видим что у меня имеется ошибка, не может прочитать файл с паппет-сервера (не хватает прав), но все остальное — отработало отлично.
Проверяем iptables на паппет-агенте:
Видим что правила применились!
Выключение/Включение Puppet в Unix/Linux
Иногда нужно выключить паппет-агент чтобы тот не запускал манифесты. Я сейчас расскажу как можно выключить или включить puppet. Ничего сложного в этом нет. Статья для общего понимания…
Смотрим состояние:
Чтобы отключить использование Puppet агента, используйте следующую команду:
- —disable — Отключает работу в локальной системе. Данное действие, блокирует систему до тех пор, пока файл блокировки удален. Это полезно, если вы тестируете конфигурацию и не хотите выполнения манифеста(ов) пока все не проверено и не убедитесь что все работает должным образом.
- «Reason is disabled» — Можно оставить комментарий (Причина отключения).
Чтобы убедиться, что он отключен, просто запустите команду:
Чтобы включить использование Puppet агента, используйте следующую команду:
Для помощи, можно использовать:
Модули в Puppet
Широкая коллекция уже существующих модулей представлена здесь
https://forge.puppet.com/
Поиск необходимого модуля
1
|
# puppet module search <search_string>
|
Например, модуля mysql
1
|
# puppet module search mysql
|
Установка модуля mysql с Puppetlabs
1
|
# puppet module install puppetlabs-mysql
|
1
2
3
4
5
6
7
|
Notice: Preparing to install into /etc/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com …
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-mysql (v3.10.0)
├── puppet-staging (v2.1.0)
└── puppetlabs-stdlib (v4.14.0)
|
1
|
# nano /etc/puppet/manifests/site.pp
|
1
2
3
4
5
6
7
|
node puppet-client {
include accounts
class { '::mysql::server':
root_password => '123456789',
override_options => { 'mysqld' => { 'max_connections' => '1024' } }
}
}
|
Проверка синтаксиса манифеста и его выполнение
1
|
# puppet parser validate /etc/puppet/manifests/site.pp
|
1
|
# puppet agent --test
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog for puppet-client.kamaok.org.ua
Info: Applying configuration version '1483050460'
Notice: /Stage[main]/Mysql::Server::Config/File[mysql-config-file]/ensure: defined content as '{md5}15d890f0648fc49e43fcffc6ed7bd2d8'
Notice: /Stage[main]/Mysql::Server::Install/Package[mysql-server]/ensure: created
Notice: /Stage[main]/Mysql::Server::Installdb/Mysql_datadir[/var/lib/mysql]/ensure: created
Notice: /Stage[main]/Mysql::Server::Service/Service[mysqld]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Mysql::Server::Service/Service[mysqld]: Unscheduling refresh on Service[mysqld]
Notice: /Stage[main]/Mysql::Server::Root_password/Mysql_user[root@localhost]/password_hash: defined 'password_hash' as '*CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D'
Notice: /Stage[main]/Mysql::Server::Root_password/File[/root/.my.cnf]/ensure: defined content as '{md5}ea36d570297b4fb03f784246ceef462c'
Notice: Finished catalog run in 84.67 seconds
|
Провереяем, что установился MySQL, пароль MySQL пользователя root установлен в 123456789, параметр max_connections установлен в 1024
1
|
# mysql -u root -p123456789 -e "show variables like 'max_connections'"
|
1
2
3
4
5
|
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1024 |
+-----------------+-------+
|
Просмотр установленных модулей
1
|
# puppet module list
|
1
2
3
4
5
6
|
/etc/puppet/modules
├── accounts (???)
├── puppet-staging (v2.1.0)
├── puppetlabs-concat (v2.2.0)
├── puppetlabs-mysql (v3.10.0)
└── puppetlabs-stdlib (v4.14.0)
|
Проверка,что puppet-manifest соотвествует стилю Puppet
1
|
# yum install rubygem-puppet-lint
|
1
|
# puppet-lint /etc/puppet/modules/accounts/manifests/ssh.pp
|
Автоматическое исправление найденных различий в стиле
1
|
# puppet-lint --fix /etc/puppet/modules/accounts/manifests/ssh.pp
|
Примеры описания некоторых ресурсов
Управление пакетами
1
2
3
4
5
|
package { 'apache':
name => 'httpd', # (namevar)
ensure => 'present' # Values: 'absent', 'latest', '2.2.1'
provider => undef, # Force an explicit provider
}
|
Управление службами
1
2
3
4
5
6
7
8
|
service { 'apache':
name => 'httpd', # (namevar)
ensure => 'running' # Values: 'stopped', 'running'
enable => true, # Define if to enable service at boot (true|false)
hasstatus => true, # Whether to use the init script' status to check
# if the service is running.
pattern => 'httpd', # Name of the process to look for when hasstatus=false
}
|
Управление файлами
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
file { 'httpd.conf':
# (namevar) The file path
path => '/etc/httpd/conf/httpd.conf',
# Define the file type and if it should exist:
# 'present','absent','directory','link'
ensure => 'present',
# Url from where to retrieve the file content
source => 'puppet://[puppetfileserver]/<share>/path',
# Actual content of the file, alternative to source
# Typically it contains a reference to the template function
content => 'My content',
# Typical file's attributes
owner => 'root',
group => 'root',
mode => '0644',
# The sylink target, when ensure => link
target => '/etc/httpd/httpd.conf',
# Whether to recursively manage a directory (when ensure => directory)
recurse => true,
}
|
Управление пользователями
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
user { 'joe':
# (namevar) The user name
name => 'joe',
# The user's status: 'present','absent','role'
ensure => 'present',
# The user's id
uid => '1001',
# The user's primary group id
gid => '1001',
# Eventual user's secondary groups (use array for many)
groups => [ 'admins' , 'developers' ],
# The user's password. As it appears in /etc/shadow
# Use single quotes to avoid unanted evaluation of $* as variables
password => '$6$ZFS5JFFRZc$FFDSvPZSSFGVdXDlHe�',
# Typical users' attributes
shell => '/bin/bash',
home => '/home/joe',
mode => '0644',
}
|
Выполнение команд
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
exec { 'get_my_file':
# (namevar) The command to execute
command => "wget http://mysite/myfile.tar.gz -O /tmp/myfile.tar.gz',
#The search path for the command. Must exist when command is not absolute
# Often set in Exec resource defaults
path => '/sbin:/bin:/usr/sbin:/usr/bin',
#A file created by the command. It if exists, the command is not executed
creates => '/tmp/myfile.tar.gz',
# A command or an array of commands, if any of them returns an error
# the command is not executed
onlyif => 'ls /tmp/myfile.tar.gz && false',
# A command or an array of commands, if any of them returns an error
# the command IS executed
unless => 'ls /tmp/myfile.tar.gz',
}
|
Puppet предоставляет различные конструкции для управления условиями внутри манифеста
Selectors
1
2
3
4
5
|
$package_name = $osfamily ? {
'RedHat' => 'httpd',
'Debian' => 'apache2',
default => undef,
}
|
Case
1
2
3
4
5
|
case $::osfamily {
'Debian': { $package_name = 'apache2' }
'RedHat': { $package_name = 'httpd' }
default: { notify { "Operating system $::operatingsystem not supported" } }
}
|
If elsif else
1
2
3
4
5
6
7
|
if $::osfamily == 'Debian' {
$package_name = 'apache2'
} elsif $::osfamily == 'RedHat' {
$package_name = 'httpd'
} else {
notify { "Operating system $::operatingsystem not supported" }
}
|
Операторы сравнения в Puppet
Puppet поддерживает некоторые общие операторы сравнения
1
|
== != < > <= >= =~ !~
|
1
2
3
4
|
if $::osfamily == 'Debian' { [ ... ] }
if $::kernel != 'Linux' { [ ... ] }
if $::uptime_days > 365 { [ ... ] }
if $::operatingsystemrelease <= 6 { [ ... ] }
|
А также оператор
1
|
in
|
1
2
|
if '64' in $::architecture
if $monitor_tool in [ 'nagios' , 'icinga' , 'sensu' ]
|
Комбинация условий
1
2
3
4
|
if ($::osfamily == 'RedHat')
and ($::operatingsystemrelease == '5') {
[ ... ]
}
|
1
2
3
|
if ($::osfamily == 'Debian') or ($::osfamily == 'RedHat') {
[ ...]
}
|