puppet从节点传播variables到erb模板?

是否有可能在节点中声明variables,并将其推广到erb模板?

例:

node basenode { $myvar = "bar" # default include myclass } node mynode extends basenode { $myvar = "foo" } class myclass { file { "/root/myfile": content => template("myclass/mytemplate.erb") ensure => present, } } 

mytemplate.erb的来源:

 myvar has value: <%= myvar %> 

我知道我的例子可能会很复杂。 但是我试图在(几乎)所有节点上传播文件,而且我希望根据请求文件的节点来更改它的内容。 当节点没有覆盖它的值时, $myvar = "bar"语句应该是默认值。

有没有解决我的问题? 我使用木偶0.24.5

编辑:这里的问题可能是variablesinheritance顺序。 这个$ myvarvariables在mynode节点中不会有foo值。 这里的解决scheme是直接在mynode中包含myclass 。 但我真的不想这样做。 在包含类之后是否有覆盖类variables值的选项?

Puppet节点inheritance与大多数其他编程语言中的inheritance不同。 包含的类将在评估孩子时立即进行评估。 然后父节点被评估。 所以我的例子将永远不会工作。 如果你想知道推荐的解决scheme,阅读傀儡 – 常见的误解 。 我这样做,它的工作原理。

虽然我不得不承认我现在很失望,因为复杂的傀儡语法可能会让初学者感到困惑。

其他答案已经指出了范围问题。 你可能想要做的只是将基节点用于variables定义,并把实际的逻辑(包括你的基类定义)分离成一个单独的类,它包含在你的所有节点中。 这样就保留了您想要的方式范围,只为您的所有节点定义添加一条额外的行。

 node basenode { $myvar = "bar" # default } node mynode extends basenode { $myvar = "foo" include baseclass } class baseclass { include myclass } class myclass { file { "/root/myfile": content => template("myclass/mytemplate.erb"), ensure => present } } 

我不是在basenode中声明默认值,而是在模板本身中声明默认值。 由于ERB主要基于ruby,所以可以用一些相当广泛的逻辑来避开。 这里是我用来pipe理snortconfiguration文件的模板的一个例子。

 var DNS_SERVERS <% if has_variable?("dns_servers") then %>[<%= dns_servers.flatten.join(',') %>]<% else %>$HOME_NET<% end %> 

在这种情况下,我正在使用一个数组,如果它存在,变成一个逗号分隔列表包含。 否则,使用默认的$ HOME_NET。 如果我们按照您的例子简化它,我们可以使用:

 myvar has value <% if has_variable?("myvar") %><% then %><%= myvar %><% else %>bar<% end %> 

同样,如果已经设置了variablesmyvar那么将会展开,否则会打印string“bar”。 这样,variablesmyvar就可以在你的节点定义中被设置或者不设置,而不受惩罚。