Моя первая мысль была примерно такой:
define my_user( $name = $title, $ensure = present, $uid, $gid, $password, $groups, $comment, $shell ) {
$managehome = $ensure ? {
present => true,
default => false,
}
user { $name:
ensure => $ensure,
managehome => $managehome,
uid => $uid,
gid => $gid,
password => $password,
groups => $groups,
comment => $comment,
shell => $shell,
}
}
Пара проблем с этим:
user
атрибут type, мне нужно изменить my_user
в двух местах.user
декларации для использования my_user
.Возможно, есть либо:
Есть у кого-нибудь рекомендации?
Есть несколько способов справиться с этим, вы можете просто использовать тернарную проверку прямо в объявлении пользователя, например:
user { $user:
ensure => $ensure,
managehome => $ensure ? { present => true, default => false, },
uid => $uid,
gid => $gid,
password => $password,
groups => $groups,
comment => $comment,
shell => $shell,
}
Предполагается, что вы здесь параметризуете свои значения, и я предполагаю, что это не обязательно так. У вас по-прежнему будет проблема с обновлением всех ссылок на типы, что может быть немного болезненным. Вместо этого вы можете использовать что-то гораздо более мощное, create_resources функция. Рассмотрим следующий отрывок из файла марионетки:
class profile::base {
$user_params = {
'user1' => { ensure => absent,
managehome => false,
uid => '1337',
gid => dev,
},
'user2' => { uid => '1338',
gid => ops,
groups => ['wheel', 'company'],
},
}
$user_defaults = {
ensure => present,
managehome => true,
groups => ['users', 'company'],
comment => 'Managed by puppet',
shell => '/bin/bash',
}
create_resources(user, $user_params, $user_defaults)
...
}
В итоге здесь происходит то, что функция create_resources принимает хеш $ user_params и динамически создает ресурс для каждой записи, используя предоставленные параметры. Кроме того, любые параметры, не предоставленные $ user_params использовать значения из $ user_defaults хэш. Приведенный выше код эффективно оценивает следующий фрагмент. (Если вы не знакомы с функцией create_resources, я настоятельно рекомендую прочитать об этом Вот)
class profile::base {
user { 'user1':
ensure => absent,
managehome => false,
uid => 1337,
gid => dev,
groups => ['users', 'company'],
comment => 'Managed by puppet',
shell => '/bin/bash',
}
user { 'user2':
ensure => present,
managehome => true,
uid => 1338,
gid => ops,
groups => ['wheel', 'company'],
comment => 'Managed by puppet',
shell => '/bin/bash',
}
...
}
Это позволяет вам быстро добавлять / изменять атрибуты для всех пользователей, которыми вы хотите управлять, без необходимости искать каждую ссылку. Скажем, если вы хотите перейти на использование ksh для своей компании, вы просто измените значение в user_defaults хэш, чтобы отразить это. Также ничто не мешает вам иметь разные группы параметров и значений по умолчанию (например, $ root_params и $ root_defaults для ваших суперпользователей) и иметь еще один вызов функции create_resources.
Развивая эту идею еще на один шаг, вы можете связать ее с данными из Hiera Тогда решение будет выглядеть так:
class profile::base {
$user_params = hiera("user-params")
$user_defaults = hiera("user-defaults")
create_resources(user, $user_params, $user_defaults)
...
}
Намного чище и удобнее для чтения. Соответствующие Hieradata json будет выглядеть так:
{
"user-params": {
"user1": {
"ensure": "absent",
"managehome": "false",
"uid": "1337",
"gid": "dev"
},
"user2": {
"uid": "1338",
"gid": "ops",
"groups": ["wheel", "company"]
}
},
"user_defaults": {
"ensure": "present",
"managehome": "true",
"groups": ["users", "company"],
"comment": "Managed by puppet",
"shell": "/bin/bash"
}
}
Я лично предпочитаю JSON для своих hieradata, но YAML также является жизнеспособным вариантом (Источники данных Hiera) Самое приятное в Hiera заключается в том, что вы можете использовать разные источники данных на основе любых критериев, которые вы решите и настроите в файле hiera.yaml (обычно это делается для каждой среды, но может быть для каждого узла)
В качестве последней мысли вы можете подумать о написании настраиваемого типа для обертывания типа пользователя, который:
Если вы решите пойти по этому пути, вы все равно получите много пользы от использования create_resources функция и Hiera
В этом сценарии есть менее чем элегантный подход к необязательным параметрам.
my_user($ensure = 'present', $uid = undef) {
if $uid != undef { User { uid => $uid } }
user { $name: ensure => $ensure }
}
Вы просто назначаете ресурсы по умолчанию для user
в рамках определения. Вы можете повторить этот шаблон для произвольного количества параметров.