使用 puppet 将现有用户添加到组

18 linux redhat user-management puppet user-accounts

是否可以使用 puppet 2.7.18 将现有用户添加到组中?

我们有两个模块,每个模块定义一个类:

  • 模块“user”创建所有用户,包括用户 foo 和用户 bar。
  • 模块“subversion”处理各种 conf 文件并创建组 svn。

我们想将用户 foo 添加到模块“subversion”内的组 svn。

我已经尝试了现有功能请求中描述的成员资格参数:

group {
"svn":
    ensure  => present,
    gid     => xxxxx;
}
user {
"foo":
    group      => ["svn"],
    membership => minimum;
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

错误:无法从远程服务器检索目录:服务器上的错误 400:重复声明:用户 [foo] 已在文件 /pathto/modules/subversion/manifests/init.pp 中的第 xx 行声明;无法在节点 myserver.example.com 上的 /pathto/modules/users/manifests/init.pp:xxx 重新声明

这个功能已经实现了吗?如果没有,有没有好的解决方法?

小智 23

使用 Puppet 虚拟资源是正确的方法 - 但是如果您无法更改用户定义并同时需要解决方法修复,以下是可怕的和 hacky,但会起作用:

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

本质上,我们只是检查 somegroup 是否包含用户 foo ......如果没有,除了 foo 所属的现有组之外,使用普通的 usermod 命令添加它。

  • 可怕和骇人听闻,但真的很有帮助。我希望不必学习新的语言结构来做一些概念上简单的事情,比如将用户添加到组中。 (2认同)

小智 18

如果您将用户声明为虚拟资源,则可以使用“实现”或集合语法(用户 <| ... |>)。下面是一个例子:

@user { 'foo':
  groups     => ['somegroup'],
  membership => minimum,
}
Run Code Online (Sandbox Code Playgroud)

然后使用 then 集合语法实现虚拟用户:

User <| title == foo |>
Run Code Online (Sandbox Code Playgroud)

在其他地方,您可以使用加号为该虚拟资源添加参数:

User <| title == foo |> { groups +> "svn" }
Run Code Online (Sandbox Code Playgroud)