Продолжение статьи про 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
Подробнее о модулях можно почитать тут>>>, а про классы — тут>>>.
