Я хочу применить принцип «СУХОЙ» (не повторяйтесь) в node.pp, группируя машины, например Машины RH5 и RH6 вместо добавления нескольких строк включений для всех серверов RH5 и RH6.
Puppet на tst-01 отлично работает при использовании:
node "tst-01" inherits basenode {
Но это ломается, когда я пытаюсь организовать серверы в группы с такой конфигурацией:
node "tst-01" inherits redhat6server {
Ошибка с "наследуется redhat6server":
err: Could not retrieve catalog; skipping run
[root@tst-01 ~]# puppet agent --test
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse template ldap/access.conf: Could not find value for 'netgroup' at 124:/etc/puppet/modules/ldap/templates/access.conf at /etc/puppet/modules/ldap/manifests/init.pp:82 on node tst-01.tst.it.test.com
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
Это файл access.conf, который отлично работает, если для параметра "наследство" установлено значение "наследует базовый узел".
[root@puppet]# grep -v "#" /etc/puppet/modules/ldap/templates/access.conf
+ : root : LOCAL
+ : @<%= netgroup %> : ALL
- : ALL : ALL
[root@puppet]#
Это конфигурация в /etc/puppet/manifests/nodes.pp.
# Basenode configuration
node "basenode" {
include resolv_conf
include sshd
include ntpd
include motd
}
# Groups
node "redhat6server" inherits basenode {
include ldap_auth
}
# Testservers
node "tst-01" inherits redhat6server {
$netgroup = tst-01
}
Вероятно, это не удается, потому что происходит наследование перед то $netgroup
переменная оценивается, и поэтому компиляция каталога не выполняется. Однако, используя этот метод для отделить код от данных имеет ограничения и следует избегать.
Я изменил код марионетки для использования иерархические данные для привязки данных и для достижения того же эффекта группировки похожих узлов. Упрощенный пример, предполагающий, что вам нужно только сгруппировать серверы RHEL, будет:
Иерархические данные будут извлечены с использованием следующего определения:
hiera.yaml
---
:backends:
- yaml
:hierarchy:
- %{::operatingsystem}
- %{::hostname}
- common
:yaml:
:datadir: /etc/puppet/hieradata/
Обе operatingsystem
и hostname
являются facts
. Хиера попытается разрешение данных в этом порядке для системы Red Hat с именем хоста some-rhel-hostname
:
Ожидается следующая структура каталогов и файлов:
/etc/puppet/hieradata/
├── common.yaml
├── RedHat.yaml
├── some-rhel-hostname.yaml
└── tst-01.yaml
Содержимое примеров файлов yaml:
common.yaml
---
classes:
- resolv_conf
- sshd
- ntpd
- motp
RedHat.yaml
---
classes:
- ladp_auth
some-rhel6-hostname.yaml
---
classes:
- this_host_only
ldap_auth::netgroup: foo-bar
tst-01.yaml
---
ldap_auth::netgroup: tst-01
nodes.pp
default {
hiera_include(classes)
}
Обратите внимание на использование hiera_include
функция, который вернет массив все значения для каждого узла (из common.yaml
и исходящие из разрешения иерархии, т. е. some-rhel-hostname
будет включать все классы из common.yaml
плюс ldap_auth
из RedHat.yaml
и this_host_only
из собственного файла yaml).
Использование привязок данных в ваших модулях выполняется по-разному в зависимости от того, какая версия puppet
ты используешь. Проверьте Вот для указателей.