我有一个 puppet 模块来设置几个 Gigaspaces PU。每个模块都有相当多的变量要放在配置文件模板中。我们还使用了几个不同的环境,因此这些变量会重复多次以包含每个环境的值。
我的问题是存储这些变量的最佳位置在哪里?它们自己的类,我导入的外部 .pp,还是其他什么?
答案1
您所问的很多问题都归结为惯例,而不是严格的语言要求......语言足够灵活,可以用多种不同的方式做事。
如果所有服务器的配置都相同,则只需一个“gigaspace”类并在其顶部设置变量就可以正常工作。
如果您的需求比单个服务器类更复杂,我会创建一个“gigaspace”模块,其中包含一个公共类,其中包含需要变量的类继承的变量。在 gigaspace/manifests 中,会有一个包含“ ”的“init.pp” class gigaspace {...}
,然后是一个包含“ ”的“common.pp class gigaspace::common {...}
”。然后,在我需要访问这些变量的任何类中,我都会从公共类继承,例如“ class gigaspace::master inherits gigaspace::common { ... }
”。
如果您不从其他类继承,那么获取其他类中的变量会很麻烦,尤其是在模板中。但是,使用直接包含,您可以通过指定全名来获得只读访问权限。
答案2
我非常喜欢使用外部节点分类器用于variable=value
在顶部范围进行设置。这样,您可以使用真实的数据存储和编程逻辑来确定给定节点的值应该是什么,而不是将一堆 puppet 语言条件堆放到一个混乱的variables.pp
文件中。继承和范围是 Puppet 中的两个大领域,它们并不像许多人期望的那样工作,而且即使您知道会发生什么,它们确实也有自己的警告和问题;如果没有外部节点,您将需要其中一个或两个。
外部节点分类器的工作方式是您配置 puppetmaster 的 puppet.conf 来运行它:
[master]
node_terminus = exec
external_nodes = /path/to/my/classifier.rb
每次客户端使用连接客户端证书名称的命令行参数进行连接时,主服务器都会执行此操作。您的代码会执行您需要的任何操作,并返回 YAML,其中包含classes:
应包含在节点中的列表以及parameters:
设置为清单和模板中使用的顶级范围变量的列表。
源代码发行版的 ext/ 目录中有几个示例分类器。这是解决“合理的默认值,以及我需要的覆盖”问题的绝佳方法。
答案3
我经常看到两种建议。一种是使用外部节点分类器,就像 eric sorenson 建议的那样。另一种是使用 extlookup。外部查找易于使用,并且包含在 Puppet 中从版本 2.6.1 开始。我对它很满意。
答案4
您可以在模块中有一个由其他模块调用的variables.pp清单。这是我见过的最常见的事情。对于环境变量,我会查看一些事实,看看您是否可以使用它们。如果您可以发布模块的示例,我可能会提供更多详细信息。