如何根据部署环境在 puppet 中生成定制的 sudoers 文件?

如何根据部署环境在 puppet 中生成定制的 sudoers 文件?

所有环境的 sudoers 文件中都包含系统管理员,但其他 sudoers 则不存在。不同环境的 sudoers 略有不同。大多数情况下,90% 的用户相同,10% 的用户不同,因此我们不能只为所有内容设置一个 sudoers 文件。

现在,我们正在使用 puppet 和 10 个不同的文件,这些文件的名称分别为 sudoers.production1、sudoers.production2、sudoers.production3、sudoers.testing1、sudoers.staging1 等等。

然后,Puppet 根据服务器的 $domain(例如:dbserver.staging1.acme.com)或 $hardwaremodel 选择要部署的文件。它运行良好,但维护这么多文件是一场噩梦。

我想根据服务器的域自动生成 sudoers 文件,并且只有一个大文件,其中包含所有用户和所有环境的所有 sudoers 权限。如下所示:

User_Alias ADMINS = abe, bob, carol, dave

case $domain {
 "staging1.acme.com" {
    #add dev1,dev2,tester1,tester2 to sudoers file 
  }
 "testing2.acme.com" {
    #add tester1, tester3, tester4 to sudoers file
  }    

最好的解决方法是什么?欢迎提出替代方案。我会很感激任何建议。

更新 1:

出于安全原因,我们不想将位于 Puppet 客户端上的文件夹中的一堆文件连接起来,以防有人将文件放入其中(无论是否恶意)并破坏组合文件或在其中插入某些内容。

最重要的是,为了可用性,我们希望将 puppet 服务器上 sudoers 相关文件(片段或完整)的数量保持为 3(prod/stage/test)或最好是 1 个文件。该文件将(以某种方式)在 puppet 服务器上生成 sudoers 文件并向每个 puppet 客户端发送一个自定义文件。

这样做的目的是只在一个文件中搜索用户名并将其删除,这比在 11 个文件中执行此操作要快得多。当将用户添加到一堆环境中时,它不会那么快,但只需打开并查看一个文件,大大降低了遗漏的可能性。

我们的 Sudo 版本是 1.6.9p8,所以我们不能使用 /sudoers.d 文件夹,只能使用 sudoers 文件。

更新2:

我一直在谷歌搜索一些内容,刚刚发现了这个,我花了一个小时查看它:

https://github.com/saz/puppet-sudo#readme

我不确定,但看起来它可能会起作用。有人用过它或听说过它吗?

答案1

sudo 是什么版本?您的 sudo 版本是否支持使用#includedir选项将内容拆分为片段目录/etc/sudoers.d/

如果是这样,那么我建议您使用该功能来构建您的配置。

将包含您控制的每个主机所共有的所有设置的主配置文件发送到/etc/sudoers。然后将特定于角色的配置放入 内的文件中/etc/sudoers.d/

每个类或 puppet 部分负责更新与该类直接相关的 sudo 配置的一小部分。

答案2

您可以查看虚拟资源并了解:https://puppet.com/docs/puppet/latest/lang_virtual.html

事实确实如此:在某些系统上您会“意识到”资源,而在某些系统上您则不会。

答案3

您可以使用 Puppet 模板...使用您需要的用户的小型 ruby​​ 代码片段/变量进行站点特定配置。(我稍后会发布一个例子)

处理此问题的传统方法是使用组定义而不是命名用户/etc/sudoers。管理起来可能没那么麻烦。

相关内容