Puppet: ноды (nodes), классы (classes) и модули (modules)

Автор: | 08/06/2014
 

puppet-logo

Продолжение статьи про 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

Подробнее о модулях можно почитать тут>>>, а про классы — тут>>>.