Я пытаюсь восстановить 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'],
}
}
Обратите внимание, что этот синтаксис также служит для собирать виртуальные ресурсы, но вполне может использоваться для переопределения параметров ресурса.
Очевидно, что этот метод приведет к хаосу, если использовать его последовательно, так что снова - Хиера превосходит в большинстве случаев.