Назад | Перейти на главную страницу

Обработка исключений для модулей в 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 классы: - 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 файл содержат значения по умолчанию.