Обработка исключений для модулей в Puppet

У меня есть модуль 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 классы: - веб-сервер - веб-сервер-apache-02

# Test variables
role: webserver
cluster: apache-02

Я думаю об использовании чего-то подобного в манифестах /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'),
    }
}

Принцип СУХОЙ (не повторяйся) важен для меня, я бы не стал клонировать весь модуль. В будущем будет много случаев, когда я захочу использовать роли для распространения определенных файлов / конфигураций в зависимости от роли сервера, но при этом делить модуль с другими серверами.

Что вы думаете об использовании этой роли: веб-сервер и if / else в качестве решения для обработки этого исключения в модуле?

1 ответ

Решение

Вы можете использовать пользовательский факт, чтобы различать их, и разрешить шаблон, используя этот факт:

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 is also a custom fact, so it is easy to build custom hierarchies as well. To handle exceptions, write a custom fact, and let the common.yaml file hold the default values.

Другие вопросы по тегам