Добавление существующего пользователя в группу с марионеткой

16

Можно ли добавить существующего пользователя в группу с Puppet 2.7.18?

У нас есть два модуля, каждый из которых определяет один класс:

  • Модуль «пользователь» создает всех пользователей, включая пользователя foo и панель пользователя.
  • Модуль "Subversion" работает с различными conf-файлами и создает группу SVN.

Мы бы хотели добавить пользователя foo в группу svn внутри модуля "subversion".

Я пробовал параметр членства, как описано в существующем запросе функции :

group {
"svn":
    ensure  => present,
    gid     => xxxxx;
}
user {
"foo":
    group      => ["svn"],
    membership => minimum;
}

Но я получаю следующую ошибку:

ошибка: не удалось получить каталог с удаленного сервера: ошибка 400 на сервере SERVER: повторное объявление: пользователь [foo] уже объявлен в файле /pathto/modules/subversion/manifests/init.pp в строке xx; не может повторно объявить в /pathto/modules/users/manifests/init.pp:xxx на узле myserver.example.com

Эта функция уже реализована? Если нет, есть ли хороший обходной путь?


источник

Ответы:

15

Если вы объявите пользователей как виртуальными ресурсами , вы можете использовать «реализовать» или синтаксис коллекции (Пользователь <| ... |>). Вот пример:

@user { 'foo':
  groups     => ['somegroup'],
  membership => minimum,
}

Затем поймите, что этот виртуальный пользователь имеет синтаксис коллекции:

User <| title == foo |>

И в другом месте вы можете добавить к параметрам для этого виртуального ресурса, используя добавление:

User <| title == foo |> { groups +> "svn" }
dotplus
источник
Поэтому я думаю, что в настоящее время нет альтернативы, кроме виртуальных ресурсов :( Большое спасибо за ответ.
1
В версиях Puppet изменена опечатка или атрибут: это не группа, а группа (множественное число). Использование Puppet 3.2.2
Горан Мискович
1
может кто-нибудь рассказать об этом на коротком примере.
mschuett
21

Использование виртуальных ресурсов Puppet - верный способ сделать это, но если вы не можете изменить определения пользователей и нуждаетесь в исправлении обходного пути, следующее ужасно и надуманно, но сработает:

exec { 'foo somegroup membership':
  unless  => '/bin/grep -q "somegroup\\S*foo" /etc/group',
  command => '/sbin/usermod -aG somegroup foo',
  require => User['foo'],
}

По сути, мы просто проверяем, содержит ли somegroup пользовательский foo ... если нет, используйте обычные команды usermod, чтобы добавить его в дополнение к существующим группам, к которым принадлежит foo.

dodocaptain
источник
1
Puppet может запросить полностью определенные пути к исполняемым файлам. Отредактировано, чтобы отразить это.
h7r
2
Ужасный и хакерский, но очень полезный. Я надеялся, что мне не придется изучать новую языковую конструкцию, чтобы сделать что-то концептуально простое, как добавление пользователя в группу.
BillMan
1
Возможно, более правильным (хотя все еще хакерским) способом было бы использовать, getent group somegroup|cut -d: -f4|grep -q fooчтобы не предполагать, что мы используем /etc/group.
Фальстро
Супер полезно - спасибо. Мне пришлось изменить слова "never" и "usermod", чтобы они включали полный путь, как показано ниже: never => "/ user / bin / grep ..." command => "/ user / bin / usermod ..."
JNP Веб-разработчик
Для @jnpWebDeveloper и им подобных: согласно документации , вы также можете указать pathпараметр. Я предлагаю иметь глобальный ресурс по умолчанию, возможно, который тянет $PATHс лица.
cincodenada
2

Спасибо - безобразный хак, но он выполняет свою работу. Вот пример (объединяющий вышеупомянутые комментарии), чтобы добавить 'nrpe' в группу 'nagios'. Я использовал пакет require, поскольку пользователь здесь предоставляет RPM, а не puppet.

  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'],
  }
Билл МакГонигл
источник