来自外部文件的 Puppet 迭代

Puppet iteration from external file

我是配置管理新手,仅供参考。

我正在尝试操纵 elasticsearch,并希望在一个文件中有一个 elasticsearch 节点的主列表(它可以用于多种用途,而不仅仅是这个目的)。

我想通过 ERB 模板添加 elasticsearch.yml 并将 FDQN 列表扩展到 discovery.zen.ping.unicast.hosts: [] 参数。

例如,我在 module/files 中有一个名为 es_hosts 的外部文件,其中包含:

host1.domain.com 
host2.domain.com 
host3.domain.com 
host4.domain.com

然后当 puppet 构建 ERB 模板时,在参数中有这个:

discovery.zen.ping.unicast.hosts: ["host1.domain.com", "host2.domain.com", "host3.domain.com", "host4.domain.com"]

我已经尝试了一些东西,但我无法理解它。

我会将此列表用于其他事情,例如构建防火墙规则等,因此我希望有一个主列表供我的团队更新以供参考。

感谢您的帮助!

与其将列表放在文件中,不如将其放在 Hiera 中,因为定义列表和其他外部数据正是 Hiera 的用途。

(如果您还没有使用过 Hiera,您绝对应该阅读它。)

因此在 Hiera 中您将拥有:

---
es_hosts:
- host1.domain.com 
- host2.domain.com 
- host3.domain.com 
- host4.domain.com

在您的清单中,您可以使用 hiera 函数从 Hiera 中读取它:

$es_hosts = hiera('es_hosts')

(请注意,我们经常使用 Puppet 的自动参数查找功能而不是 hiera 功能来将数据从 Hiera 读取到我们的清单中,但是您在这里的要求 - 在多个上下文中使用的 ES 主机列表 - 建议你会希望这个列表不绑定到特定的 class 输入。如果这对你现在没有意义,你将需要了解参数化 类 和自动参数查找,但否则与此答案无关。)

最后,在您的 ERB 模板中,您将拥有:

discovery.zen.ping.unicast.hosts: ["<%= @es_hosts.join('", "') %>"]

请注意,清单中的 $es_hosts 变量是通过 ERB 模板中的 Ruby 实例变量 @es_hosts 访问的。

最后,请注意 Puppet Forget here 上提供了一个 Elasticsearch Puppet 模块。您可能会发现使用该模块比编写自己的模块更好。