木偶:可变的压倒一切的最佳实践

我想知道什么是在傀儡中重写variables的最佳实践。 我想让所有的节点(位于不同的地方,其中一些是qa,一些是活的)拥有相同的类。 现在我有这样的东西:

class base_linux { <...> # something which requires $env and $relayhost variables } class linux_live { $relayhost="1.1.1.1" $env = "prod" include base_linux } class linux_qa { $relayhost="2.2.2.2" # override relayhost include base_linux } class linux_trunk { $env = "trunk" # override env inlude linux_qa } node "trunk01" { include linux_trunk include <something else> } node "trunk02" { $relayhost = "3.3.3.3" # override relayhost include linux_trunk include <something else> } node "prod01" { include linux_prod } 

所以,我想在base_linux中有一些默认设置,它可以被linux_qa / linux_live覆盖,这可以在更高级别的类和节点定义中被覆盖。

当然,这是行不通的(也没有预料到的效果)。 它也不适用于类inheritance。 也许,我将能够使用全局范围variables进行归档,但对我来说似乎不是一个好主意。

解决这个问题的最好方法是什么?

最佳实践取决于您pipe理的节点/系统的数量。 如果您可以跟踪数据(在数千个系统中我已经看到了这一点),那么在puppet清单中build模数据就足够了,但是如果您有大量的variables和深度inheritance,那么特别是如果您开始按范围进行引用时,作为$值= $ some_class :: some_var)。 如果你有一个复杂的基础设施,可以使用extlookup,heira或者外部节点分类器(ENC)来分离数据。

你在木偶清单中完成的方式是使用dynamic范围和节点inheritance,dynamic范围在Puppet 2.7中被弃用。 如果这个在extlookup中被重写,那简直就是:

 # configured globally # linux_qa is more likely linux_%{env} $extlookup_precedence = ["%{fqdn}", "linux_trunk", "linux_qa", "common"] # in the appropriate class $relayhost = extlookup("relayhost") 

看来我已经find了一个很好的方法来做到这一点:不是在类中定义variables,而是使variables只有节点模板。 所以,我最终会得到如下结果:

 node basenode { } node linux_prod inherits basenode { $relayhost="1.1.1.1" $env = "prod" } node linux_qa inherits basenode { $relayhost="2.2.2.2" } node linux_trunk inherits linux_qa { $env = "trunk" } class base_linux { # no valuables defined here <...> } node trunk01 inherits linux_trunk { $relayhost = "3.3.3.3" # I can override here for single node include base_linux } 

我自己的build议是不要把variables放在类上 – 只要这个类需要重写某些东西。

把你的variables放在site.pp(或者一些导入的文件 – 我的名字是globals.pp),把规则分辨出它们应该有的值 – select而不是覆盖。 然后,您可以根据需要在节点或类上进行单独的覆盖。