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

系统pipe理员存在于所有环境的sudoers文件中,但是其他sudoers不是。 不同的环境都有略微不同的sudoers。 大多数情况下,90%的用户是相同的,10%是不同的,所以我们不能只有一个sudoers文件的一切。

目前,我们正在使用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 } 

最好的办法是什么呢? 欢迎提出替代scheme。 我会很感激任何提示。

更新1:

出于安全原因,我们宁愿不连接位于puppet客户端的文件夹中的一堆文件,以防有人将文件放在那里(恶意或不合法),或者中断合并的文件或插入某些文件。

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

这样做的目的只是在一个文件中search一个用户名,并且比在11个文件上更快地删除它。 当把一个用户添加到一堆环境中时,它不会那么快,但是只需打开一个文件就可以看到,大大减less了遗漏的可能性。

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

UPDATE2:

我一直在search一些,我刚刚发现了这个,我花了一个小时在看:

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

我不确定,但它看起来可能会伎俩。 有没有人使用过或听说过?

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

如果是这样,那么我build议你使用该function来build立你的configuration。

将主要的configuration文件传送到/etc/sudoers ,其中包括您控制的每个主机所共有的所有设置。 然后将特定于angular色的configuration放到/etc/sudoers.d/文件中。

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

看看虚拟资源,并实现 – http://docs.puppetlabs.com/guides/virtual_resources.html – 这确实是 – 在一些系统上,你“认识到”资源,有些则不然。

你可以使用Puppet模板做…使用一个小型的ruby代码片段/variables为你需要的用户进行特定于站点的configuration。 (我稍后会发表一个例子)

处理这个问题的传统方法是在/etc/sudoers使用组定义而不是named-users。 pipe理起来可能不麻烦。