Можно ли добавить существующего пользователя в группу с помощью марионетки 2.7.18?
У нас есть два модуля, каждый определяет один класс:
Мы хотим добавить пользователя foo в группу svn внутри модуля subversion.
Я пробовал параметр членства, как описано в существующий запрос функции:
group {
"svn":
ensure => present,
gid => xxxxx;
}
user {
"foo":
group => ["svn"],
membership => minimum;
}
Но я получаю следующую ошибку:
ошибка: не удалось получить каталог с удаленного сервера: ошибка 400 на СЕРВЕРЕ: повторяющееся объявление: пользователь [foo] уже объявлен в файле /pathto/modules/subversion/manifests/init.pp в строке xx; невозможно повторно объявить в /pathto/modules/users/manifests/init.pp:xxx на узле myserver.example.com
Эта функция уже реализована? Если нет, есть ли хорошее решение?
Использование виртуальных ресурсов Puppet - это правильный способ сделать это, но если вы не можете изменить определения пользователей и тем временем нуждаетесь в исправлении обходного пути, следующее ужасно и взломано, но будет работать:
exec { 'foo somegroup membership':
unless => '/bin/grep -q "somegroup\\S*foo" /etc/group',
command => '/sbin/usermod -aG somegroup foo',
require => User['foo'],
}
По сути, мы просто проверяем, содержит ли некоторая группа пользователя foo ... если нет, используйте обычные команды usermod, чтобы добавить его в дополнение к существующим группам, которым принадлежит foo.
Если вы объявите пользователей как виртуальные ресурсы , затем вы можете использовать «реализовать» или синтаксис коллекции (Пользователь <| ... |>). Вот пример:
@user { 'foo':
groups => ['somegroup'],
membership => minimum,
}
Затем реализуйте этого виртуального пользователя с синтаксисом коллекции:
User <| title == foo |>
А в другом месте вы можете добавить к параметрам для этого виртуального ресурса, используя plusignment:
User <| title == foo |> { groups +> "svn" }
Спасибо - уродливый хакер, но он выполняет свою работу. Вот патчированный пример (объединяющий приведенные выше комментарии) для добавления «nrpe» в группу «nagios». Я использовал пакет require, поскольку здесь пользователю предоставляется RPM, а не марионетка.
exec {"nrpe nagios membership":
unless => "/bin/getent group nagios|/bin/cut -d: -f4|/bin/grep -q nrpe",
command => "/usr/sbin/usermod -a -G nagios nrpe",
require => Package['nrpe'],
}