18 linux redhat user-management puppet user-accounts
是否可以使用 puppet 2.7.18 将现有用户添加到组中?
我们有两个模块,每个模块定义一个类:
我们想将用户 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 命令添加它。
小智 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)