我开始使用 puppet 来管理我们的 RHEL 服务器。此时我尝试设置用户管理。我们在校园内运行 NIS 环境,所以到目前为止,我将行 +testuser::::: 添加到 /etc/passwd 文件中,然后通过 NIS 接收用户信息。我想要实现的是,我有一组管理员用户(admin1、admin2 和 admin3),它们可以登录到每台机器,还有一组用户(user1、user2 和 user3),它们在每台机器上都不同。在 passwd 文件的末尾,我需要一个输入行 +::::::/sbin/nologin 来提供所有用户信息,但不授予他们访问权限。
因此一台机器上的 /etc/passwd 看起来像这样
+admin1::::::
+admin2::::::
+admin3::::::
+user1::::::
+user2::::::
+::::::/sbin/nologin
在另一台机器上
+admin1::::::
+admin2::::::
+admin3::::::
+user1::::::
+user3::::::
+::::::/sbin/nologin
因为管理员用户是相当静态的,但是普通用户在不同系统之间是不同的,所以我想在一个模块中声明管理员用户,并在每个节点上声明普通用户。
我的第一个问题是,如何编辑 /etc/passwd 文件以添加行。此外,排序正确也很重要,这样 nologin 行就位于末尾。您知道如何灵活地实现这一点吗?
感谢致敬
答案1
当你向清单中添加资源时, Puppet 将/etc/passwd
自行编辑,user
例如
user {
'admin1':
ensure => present,
uid => 1003,
password => '$6$...',
}
对现有行进行排序非常棘手。Puppet 本身不支持任何此类操作。我的建议是使用exec
如下资源:
exec {
'/path/to/script-that-moves-nologin-line-to-the-end':
unless => '/script/that/returns-true-if-nologins-line-is-currently-at-the-end'
}
您可能希望 Puppet 在将所有用户资源同步到您的系统后执行此操作。有多种方法可以实现此操作,每种方法都有其优缺点。
假设您的清单不是太复杂,您可能可以使用该user
类型的全局默认值。
User { before => Exec['/path/to/script-that-moves-nologin-line-to-the-end'] }
但要小心,不要让任何user
资源用不同的值覆盖它before
。
其他替代方案包括
其中包括可能想到的。
答案2
最新版本的 stdlib 中有一个函数-(https://forge.puppetlabs.com/puppetlabs/stdlib) - 称为“file_line”,它可以帮助您实现您想要做的事情:
我还没有测试过,但是资源可能看起来像这样:
file_line { 'nis_admin_users':
path => '/etc/passwd',
line => '+::::::/sbin/nologin',
}
但是,我不确定如何确保该行位于最底部,因为您提到顺序确实很重要。原始文件是否可能已经包含类似的行?如果是这样,您可以使用 file_line 的附加可选参数“match”,并制作一个正则表达式来匹配。
或者,考虑使用 augues ->http://projects.puppetlabs.com/projects/1/wiki/puppet_augeas#Using+Puppet+with+Augeas