处理 Puppet 中模块的异常

处理 Puppet 中模块的异常

我在 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保存默认值。

相关内容