У меня есть модуль LDAP в Puppet, который используется 100 серверами и редактирует около 10 файлов на всех серверах, прежде чем он запустит authconfig --updateall для активации новой конфигурации LDAP.
Большинству (98) из этих серверов требуется стандартный access-1.conf в качестве access.conf, но 2 серверам требуется access-2.conf. Это часть большого модуля ldap, поэтому всем 100 серверам требуется 99% этого модуля ldap, но для некоторых серверов (в будущем в зависимости от их роли) требуется исключение для access.conf.
[модули root @ puppetmaster] # cat /etc/puppet/hieradata/environment/prd/webserver-03.yaml классы: - webserver - webserver-apache-02
# Test variables
role: webserver
cluster: apache-02
Я подумываю использовать что-то вроде этого в manifest / init.pp:
$role = hiera('role');
if($role = 'webserver') {
file { '/etc/security/access.conf':
owner => 'root',
group => 'root',
mode => '644',
content => template('ldap/access-2.conf'),
}
else {
file { '/etc/security/access.conf':
owner => 'root',
group => 'root',
mode => '644',
content => template('ldap/access-2.conf'),
}
}
Для меня важен принцип DRY (Don't Repeat Yourself), я бы предпочел не клонировать весь модуль. В будущем будет много случаев, когда я захочу использовать роли для распространения определенных файлов / конфигураций в зависимости от роли сервера, при этом сохраняя общий доступ к модулю с другими серверами.
Что вы думаете об использовании этой роли: веб-сервера и if / else в качестве решения для обработки этого исключения в модуле?
Вы можете использовать настраиваемый факт, чтобы различать их, и разрешить шаблон, используя этот факт:
class foo (
$role,
){
file { '/etc/security/access.conf':
owner => 'root',
group => 'root',
mode => '644',
content => template("$role.ldap/access-2.conf"),
}
}
Используя текущий facter
версии, легко предоставить настраиваемые факты на ваших серверах:
# cat /etc/facter/facts.d/datacenter.yaml
---
role: webserver
location: Oz
Затем, в зависимости от того, как вы настроили свою иерархию, вы можете иметь роль и роли по умолчанию для каждого домена или хоста, например:
---
:backends:
- yaml
:hierarchy:
- "%{::hostname}"
- common
:yaml:
:datadir: "/etc/puppet/hieradata/%{::domain}/%{::location}"
Вот, location
также является настраиваемым фактом, поэтому также легко создавать настраиваемые иерархии. Чтобы обработать исключения, напишите собственный факт и позвольте common.yaml
файл содержат значения по умолчанию.