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

Переопределение параметров в ранее объявленном ресурсе марионетки

Я пытаюсь восстановить nwaller марионеточный модуль sssd быть полностью на основе LDAP и быть немного чище. В нем у нас есть ресурс, определенный для каждого домена аутентификации в форме

define sssd::domain ( 
  $domain = $name,
  $domain_description = '',
  $domain_type,
  $ldap_uri = 'ldap://example.com',
  $ldap_search_base = 'dc=example,dc=com',
  $simple_allow_groups,
....
)

Это определение затем передается как concat::fragment который заполняет шаблон для построения финального sssd.conf.

Все это отлично работает, если я определяю сервер LDAP в каждом узле, как в:

node.pp

node "node1.systems.private" {
  include "puppet::client"
  class {
    'sssd':
      domains => [ 'LDAP' ],
      make_home_dir => true;
  }
  sssd::domain { 'LDAP':
    domain_type            => 'ldap',
    ldap_uri               => 'ldaps://ldap.site.com:636',
    ldap_search_base       => 'DC=site,DC=com',
    ldap_user_search_base  => 'OU=People,DC=site,DC=com',
    ldap_group_search_base => 'OU=Groups,DC=site,DC=com',
    ldap_default_bind_dn   => 'CN=bindaccount,OU=Service Accounts,OU=People,DC=site,DC=com',
    ldap_default_authtok   => 'soopersekretbindpw',
    simple_allow_groups    => ['SysAdmins','AppAdmins'],
  }
} 

Я бы предпочел гораздо более иерархическую структуру. Держать sssd::domain определение как можно более общее, поэтому я могу поддерживать его как модуль, независимый от конфигураций нашей организации. Определите сервер LDAP в глобальной конфигурации, а затем в каждом узле определите, какие конкретные группы нуждаются в доступе. Так что что-то вроде:

модули / орг / манифесты / default.pp

class org::default {
  include "puppet::client"
  class {
    'sssd':
      domains => [ 'LDAP' ],
      make_home_dir => true;
  }
  sssd::domain { 'LDAP':
    domain_type            => 'ldap',
    ldap_uri               => 'ldaps://ldap.site.com:636',
    ldap_search_base       => 'DC=site,DC=com',
    ldap_user_search_base  => 'OU=People,DC=site,DC=com',
    ldap_group_search_base => 'OU=Groups,DC=site,DC=com',
    ldap_default_bind_dn   => 'CN=bindaccount,OU=Service Accounts,OU=People,DC=site,DC=com',
    ldap_default_authtok   => 'soopersekretbindpw',
  }
} 

node.pp

node "node1.systems.private" {
  include "org::default"

  sssd::domain { 'LDAP':
    simple_allow_groups    => ['SysAdmins','AppAdmins'],
  }
}

Как и ожидалось, это приводит к ошибке дублирования объявления при попытке применить определение. Есть ли способ сделать это, выборочно переопределить параметры, или я застрял с определением домена аутентификации в исходном определении, а затем переопределением параметров авторизации в каждом узле?

Я бы использовал Hiera: http://docs.puppetlabs.com/hiera/latest/

Hiera позволяет отделить переменные данные от манифестов Puppet.

Hiera, как следует из названия, имеет иерархическую структуру, что позволяет использовать несколько интересных способов переопределения, а также объединения переменных данных.

Сначала измените объявление sssd :: domain, чтобы выполнить поиск Hiera для параметров:

sssd::domain { 'LDAP':
    domain_type            => 'ldap',
    ldap_uri               => hiera('ldap_uri', 'ldaps://ldap.site.com:636'),
    ldap_search_base       => hiera('ldap_search_base', 'DC=site,DC=com'),
    ldap_user_search_base  => hiera('ldap_user_search_base', 'OU=People,DC=site,DC=com'),
    ldap_group_search_base => hiera('ldap_group_search_base', 'OU=Groups,DC=site,DC=com'),
    ldap_default_bind_dn   => hiera('ldap_default_bind', 'CN=bindaccount,OU=ServiceAccounts,OU=People,DC=site,DC=com'),
    ldap_default_authtok   => hiera('ldap_default_authtok', 'soopersekretbindpw'),
    simple_allow_groups    => hiera_array('ldap_simple_allow_groups', ['SysAdmins','AppAdmins']),
}

В приведенном выше коде я определил значения по умолчанию для каждого поиска. Вы можете исключить их, если хотите, оставив значения по умолчанию в вашем наиболее общем файле данных Hiera (обычно "common.yaml" или "common.json"):

common.yaml:

---
ldap_uri: ldaps://ldap.site.com:636
ldap_search_base: DC=site,DC=com
ldap_simple_allow_groups:
 - SysAdmins
 - AppAdmins

Для битов, которые вы хотите персонализировать для каждого хоста, вы должны создать файл YAML или JSON с именем FQDN соответствующего хоста и поместить туда необходимые значения.

node1.systems.private.yaml:

---
ldap_simple_allow_groups:
 - SomeOtherGroup

В этом примере обратите внимание, что ldap_simple_allow_groups использует hiera_array функция поиска. Это объединит ВСЕ действительные находки в иерархии. Таким образом, node1 получит значения, определенные в common.yaml, а также "SomeOtherGroup", определенные в его собственном файле YAML.

Прочтите документацию по типам поиска Hiera для получения более подробной информации: http://docs.puppetlabs.com/hiera/latest/lookup_types.html

Хотя Hiera - лучший способ и он должным образом принят, я хотел бы добавить для полноты: существует синтаксис для выполнения именно этого переопределения, которое вы имели в виду:

node "node1.systems.private" {
  include "org::default"

  Sssd::Domain<| title == 'LDAP' |> {
    simple_allow_groups => ['SysAdmins','AppAdmins'],
  }
}

Обратите внимание, что этот синтаксис также служит для собирать виртуальные ресурсы, но вполне может использоваться для переопределения параметров ресурса.

Очевидно, что этот метод приведет к хаосу, если использовать его последовательно, так что снова - Хиера превосходит в большинстве случаев.