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

goz*_*ozu 3 linux sudo configuration-management puppet

系统管理员存在于所有环境的 sudoers 文件中,但其他 sudoers 没有。不同的环境都有略微不同的sudoer。大多数时候,90% 的用户是相同的,10% 的用户不同,所以我们不能只有一个 sudoers 文件来处理所有事情。

现在,我们正在使用具有 10 个不同文件的 puppet,名称分别为 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
  }    
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最佳方法是什么?欢迎提供替代方案的建议。我很感激任何提示。

更新 1:

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

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

这样做的目的是只在单个文件中搜索用户名,并比在 11 个文件中更快地删除它。将用户添加到一堆环境中时,不会那么快,但只需要打开和查看一个文件,大大减少了遗漏的机会。

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

更新2:

我一直在谷歌上搜索一些,我刚刚找到了这个,过去一个小时我一直在看:

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

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

Zor*_*che 9

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

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

将您的主配置文件交付给/etc/sudoers包含您控制的每个主机的所有通用设置。然后将特定于角色的配置放入/etc/sudoers.d/.

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