Продолжение статьи про Puppet – CentOS: установка и настройка Puppet-сервера и Puppet-агента.
Содержание
Использование node в Puppet
Основной схемой для управления большим количеством конфигураций для разных клиентов является описание каждого из них в нодах (nodes
).
К примеру, в файле site.pp
можно добавить такой блок:
node default { file { "/tmp/file": owner => "root", group => "wheel", mode => 777, } } node 'centos_4' { file { "/tmp/file": owner => "root", group => "wheel", mode => 777, } }
В данном примере у нас puppet-server
работает на хосте centos_3
, а puppet
-клиент – на хосте centos_4
.
Содержимое ноды default
будет применяться ко всем клиентам, описания для которых не было найдено (в данном случае – для хоста centos_3
).
Следующий блок – node 'centos_4'
описывает действия для клиента с hostname centos_4
.
Создаём тестовый файл:
# touch /tmp/file
Проверяем права:
# ls -l /tmp/file -rw-r--r--. 1 root root 0 Jul 3 09:21 /tmp/file
Повторяем на клиенте.
Теперь – на сервере применим конфигурацию:
# puppet apply site.pp Notice: Compiled catalog for centos_3 in environment production in 0.17 seconds Notice: /Stage[main]/Main/Node[default]/File[/tmp/file]/group: group changed 'root' to 'wheel' Notice: /Stage[main]/Main/Node[default]/File[/tmp/file]/mode: mode changed '0644' to '0777' Notice: Finished catalog run in 0.06 second
Ожидаем выполнения того же на клиенте (для удобства – выставим runinterval =10
, см. предыдущую статью). Проверяем:
# ls -l /tmp/file -rwxrwxrwx. 1 root wheel 0 Jul 3 09:22 /tmp/file
Отлично.
Теперь – изменим права на сервере (default
нода, т.к. имя хоста не описано):
node default { file { "/tmp/file": owner => "root", group => "wheel", mode => 400, } }
И для клиента:
node 'centos_4' { file { "/tmp/file": owner => "root", group => "wheel", mode => 644, } }
Ещё раз запускаем на сервере:
# puppet apply site.pp Notice: Compiled catalog for centos_3 in environment production in 0.18 seconds Notice: /Stage[main]/Main/Node[default]/File[/tmp/file]/mode: mode changed '0777' to '0400' Notice: Finished catalog run in 0.05 seconds
Проверяем файл на сервере:
# ls -l /tmp/file -r--------. 1 root wheel 0 Jul 3 09:21 /tmp/file
Ожидаем на сервере записи в логе:
[2014-07-03 09:27:39] 192.168.1.110 - - [03/Jul/2014:09:27:39 EEST] "PUT /production/report/centos_4 HTTP/1.1" 200 9 [2014-07-03 09:27:39] - -> /production/report/centos_4
И идём смотреть на клиенте:
# ls -l /tmp/file -rw-r--r--. 1 root wheel 0 Jul 3 09:22 /tmp/file
Всё работает. Для каждого хоста работает своя отдельная конфигурация.
Ноды можно перечислять как напрямую в файле site.pp
– так и подключать описание из внешних файлов.
Вынесем описания наших в нод в файл /etc/puppet/manifests/nodes/nodes.pp
:
# cat /etc/puppet/manifests/nodes/nodes.pp node default { file { "/tmp/file": owner => "root", group => "wheel", mode => 777, } } node 'centos_4' { file { "/tmp/file": owner => "root", group => "wheel", mode => 777, } }
Обратите внимание что мы опять поменяли права на 777, что бы гарантировано увидеть изменения.
И удалим описания из файла site.pp
, но добавим строку импорта:
# cat site.pp | grep -v '#' import 'nodes/nodes.pp'
Запускаем:
# puppet apply site.pp Warning: The use of 'import' is deprecated at /etc/puppet/manifests/site.pp:40. See http://links.puppetlabs.com/puppet-import-deprecation (at grammar.ra:610:in `_reduce_190') Notice: Compiled catalog for centos_3 in environment production in 0.17 seconds Notice: /Stage[main]/Main/Node[default]/File[/tmp/file]/mode: mode changed '0400' to '0777' Notice: Finished catalog run in 0.05 seconds
Проверяем файл на сервере:
# ls -l /tmp/file -rwxrwxrwx. 1 root wheel 0 Jul 3 09:21 /tmp/file
Предупреждение "Warning: The use of 'import' is deprecated"
подробно описано тут>>>. Вкратце – с версии 4 функция import
будет убрана из Puppet вообще, а пока им просто рекомендуют не пользоваться.
Решение – либо описывать ноды в файле site.pp
, либо использовать конфигурацию основанную не на файлах – а на директориях, когда в указанной директории будут считываться все файлы.
И на клиенте:
# ls -l /tmp/file -rwxrwxrwx. 1 root wheel 0 Jul 3 09:22 /tmp/file
Подробнее про ноды смотрите тут>>>.
Использование class и модулей в Puppet
Каждый блок, включающий в себя описание файлов, или действий, или программы, которую необходимо установить, в терминологии Puppet называется ресурсом (resource
).
В приведённых выше примерах ресурсами являлись блоки:
file { "/tmp/file": owner => "root", group => "wheel", mode => 777, }
Вместо того, что бы для каждой ноды описывать все ресурсы – их можно заключить в классы, которые потом можно подключать в описание ноды.
Начиная с версии 3.0, как уже упоминалось, Puppet отказывается от использования include
. Тем не менее, пока им ещё можно пользоваться, что мы и сделаем.
Создадим файл /etc/puppet/manifests/classes/tmpfile.pp
с таким содержанием:
class file { file { "/tmp/file": owner => "root", group => "wheel", mode => 644, } }
Мы создали простой класс с именем file
, который описывает ресурс типа file
с некоторыми действиями (и опять поменяли права доступа, что бы увидеть результат).
Теперь отредактируем файл с описанием нод, и подключим в него класс, вместо описания ресурса для каждой из них:
node default { include file } node 'centos_4' { include file }
И добавим импорт класса в файл site.pp
, что бы он выглядел таким образом:
# cat site.pp | grep -v '#' import 'classes/tmpfile.pp' import 'nodes/nodes.pp'
Запускаем puppet
:
# puppet apply site.pp Warning: The use of 'import' is deprecated at /etc/puppet/manifests/site.pp:8. See http://links.puppetlabs.com/puppet-import-deprecation (at grammar.ra:610:in `_reduce_190') Notice: Compiled catalog for centos_3 in environment production in 0.38 seconds Notice: /Stage[main]/File/File[/tmp/file]/mode: mode changed '0777' to '0644' Notice: Finished catalog run in 0.07 seconds
Проверяем права на файл:
# ls -l /tmp/file -rw-r--r--. 1 root wheel 0 Jul 3 09:21 /tmp/file
И на клиенте:
# ls -l /tmp/file -rw-r--r--. 1 root wheel 0 Jul 3 09:22 /tmp/file
Что бы избежать Warning-ов – давайте перенесём наш класс в модули.
Создаём каталог:
# mkdir -p /etc/puppet/modules/file/manifests
Обязательное условие – имя каталога внутри /etc/puppet/modules/
должно быть таким же, как имя используемого модуля.
В каталоге manifests
будут содержаться файлы с описанием самого модуля, главный из них – файл init.pp
, который должен содержать описание класса, с таким же именем как и имя модуля:
# cat /etc/puppet/modules/file/manifests/init.pp class file { file { "/tmp/file": owner => "root", group => "wheel", mode => 777, } }
(и снова меняем права доступа)
Теперь закомментируем импорт в site.pp
:
# cat site.pp | grep classes #import 'classes/tmpfile.pp'
И вынесем описание нод в сам файл site.pp
:
node default { include file } node 'centos_4' { include file }
Запускаем:
# puppet apply site.pp Notice: Compiled catalog for centos_3 in environment production in 0.32 seconds Notice: /Stage[main]/File/File[/tmp/file]/mode: mode changed '0644' to '0777' Notice: Finished catalog run in 0.05 seconds
Проверяем на сервере:
# ls -l /tmp/file -rwxrwxrwx. 1 root wheel 0 Jul 3 09:21 /tmp/file
И на клиенте:
# ls -l /tmp/file -rwxrwxrwx. 1 root wheel 0 Jul 3 09:22 /tmp/file
Один модуль может содержать несколько классов.
Для того, что бы определить дополнительные классы – их необходимо перечислить в отдельных файлах в каталоге /etc/puppet/modules/имя_модуля/manifests
.
Давайте добавим новый класс:
# cat /etc/puppet/modules/file/manifests/echo.pp class file::echo { exec { "/bin/echo 'Hello from Puppet' > /tmp/file": } }
Тут в имени класса обязательно указывается имя модуля который содержит этот класс.
Таким же образом (с указанием имени модуля) вызовем его в файле site.pp
:
node default { include file include file::echo } node 'centos_4' { include file include file::echo }
Запускаем puppet
:
# puppet apply site.pp Notice: Compiled catalog for centos_3 in environment production in 0.37 seconds Notice: /Stage[main]/File::Echo/Exec[/bin/echo 'Hello from Puppet' > /tmp/file]/returns: executed successfully Notice: Finished catalog run in 0.21 seconds
Проверяем файл:
# cat /tmp/file Hello from Puppet
И на клиенте:
# cat /tmp/file Hello from Puppet
Подробнее о модулях можно почитать тут>>>, а про классы – тут>>>.