puppet nis 用户管理

puppet nis 用户管理

我开始使用 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

其他替代方案包括

  • before用覆盖所有现有user资源的价值资源收集者
  • 运行阶段
  • 将您的资源集中user在几个课程中,然后添加require => Class[...]exec

其中包括可能想到的。

答案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

相关内容