是否可以使用 puppet 2.7.18 将现有用户添加到组?
我们有两个模块,每个模块定义一个类:
- 模块“用户”创建所有用户,包括用户 foo 和用户 bar。
- 模块“subversion”处理各种conf文件并创建组svn。
我们想要将用户 foo 添加到模块“subversion”内的组 svn 中。
我已经尝试了如下所述的 membership 参数现有的功能请求:
group {
"svn":
ensure => present,
gid => xxxxx;
}
user {
"foo":
group => ["svn"],
membership => minimum;
}
但我收到以下错误:
错误:无法从远程服务器检索目录:服务器上出现错误 400:重复声明:用户 [foo] 已在文件 /pathto/modules/subversion/manifests/init.pp 的第 xx 行中声明;无法在节点 myserver.example.com 上的 /pathto/modules/users/manifests/init.pp:xxx 上重新声明
此功能已实现吗?如果没有,有没有什么好的解决方法?
答案1
如果你将用户声明为虚拟资源然后,您可以使用 'realize' 或集合语法 (User <| ... |>)。以下是示例:
@user { 'foo':
groups => ['somegroup'],
membership => minimum,
}
然后用then集合语法实现虚拟用户:
User <| title == foo |>
您还可以在其他地方使用 plusignment 添加该虚拟资源的参数:
User <| title == foo |> { groups +> "svn" }
答案2
使用 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 所属的现有组之外。
答案3
谢谢 - 确实很丑陋,但可以完成工作。这是一个带路径的示例(结合上述评论),用于将“nrpe”添加到“nagios”组。我使用了软件包要求,因为这里的用户是 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'],
}