我在 Puppet 中有一个 LDAP 模块,它被 100 台服务器使用,并在所有服务器上编辑了大约 10 个文件,然后运行 authconfig --updateall 来激活新的 LDAP 配置。
这些服务器中的大多数 (98) 都需要标准的 access-1.conf 作为其 access.conf,但有 2 台服务器需要 access-2.conf。这是大型 ldap 模块的一部分,因此所有 100 台服务器都需要该 ldap 模块的 99%,但有些服务器(未来将根据其角色增加更多服务器)需要 access.conf 的例外。
[root@puppetmaster 模块]# cat /etc/puppet/hieradata/environment/prd/webserver-03.yaml 类:- webserver - webserver-apache-02
# Test variables
role: webserver
cluster: apache-02
我正在考虑在 manifests/init.pp 中使用类似这样的内容:
$role = hiera('role');
if($role = 'webserver') {
file { '/etc/security/access.conf':
owner => 'root',
group => 'root',
mode => '644',
content => template('ldap/access-2.conf'),
}
else {
file { '/etc/security/access.conf':
owner => 'root',
group => 'root',
mode => '644',
content => template('ldap/access-2.conf'),
}
}
DRY(不要重复自己)原则对我来说很重要,我宁愿不克隆整个模块。将来会有很多情况下,我希望使用角色根据服务器的角色分发特定文件/配置,同时仍与其他服务器共享模块。
您认为使用此角色:webserver 和 if/else 作为在模块中处理此异常的解决方案怎么样?
答案1
您可以使用自定义事实来区分它们,并使用该事实解析模板:
class foo (
$role,
){
file { '/etc/security/access.conf':
owner => 'root',
group => 'root',
mode => '644',
content => template("$role.ldap/access-2.conf"),
}
}
使用当前facter
版本,可以轻松地在您的服务器上提供自定义事实:
# cat /etc/facter/facts.d/datacenter.yaml
---
role: webserver
location: Oz
然后,根据您配置层次结构的方式,您可以拥有一个默认角色以及每个域或主机的角色,例如:
---
:backends:
- yaml
:hierarchy:
- "%{::hostname}"
- common
:yaml:
:datadir: "/etc/puppet/hieradata/%{::domain}/%{::location}"
这里,location
也是一个自定义事实,因此也很容易构建自定义层次结构。要处理异常,请编写自定义事实,并让文件common.yaml
保存默认值。