在Puppet 3和之前的版本中,模板从它们的调用类定义继承范围的方式与本机定义类型的方式相同,所以如果我有一个带有由define创建的模板源的文件资源,那么该模板可以使用变量集在调用类中,无论哪个类都称为define。
在Puppet 4中(也使用Puppet 3.8未来解析器测试过),似乎不再是这种情况,并且它导致在我的环境中难以衡量的破坏,这依赖于成千上万的这种行为代码行。有什么方法可以让它回来吗?在研究之后,即使将定义转换为本机类型也无法解决问题,因为它们依赖于通过自定义函数收集有关不同模块中可用模板的服务器端信息的能力,以及本机资源类型中的所有内容似乎发生在客户端。
这是可以修复的,还是我试图等待Puppet 5?
编辑:这里不要过多地关注'范围'一词 - 我需要任何方法将所有类变量传递给一个定义并将其解压缩到那里以便它们可用于模板,或者一种方法本机类型查看puppetmaster上指定模块内的文件。我会接受任何奇怪的,模糊的消息传递选项,只要它有这个结果,因为类不知道模板所在的 - 只有定义的,因为它正在利用辅助函数扫描服务器上的文件系统。
编辑2:为了证明这在Puppet 3.8.5中按预期工作,请使用以下内容:
模块/ SO1 /舱单/ autotemplate.pp:
<TextBlock>
<Run Text="Operation failed" Foreground="Red"/>
<Run Text="Operation complete" Foreground="Green"/>
</TextBlock>
in modules / so2 / manifests / example.pp:
# Minimal define example for debugging
define so1::autotemplate (
$ensure = 'present',
$module = $caller_module_name,
) {
$realtemplate = "${module}${title}"
file { $title :
ensure => $ensure,
owner => 'root', group => 'root', mode => '0600',
content => template($realtemplate),
}
}
在modules / so2 / templates / tmp / qwerasdf中:
# Example class calling so1::autotemplate
class so2::example (
$value = 'is the expected value'
) {
so1::autotemplate { '/tmp/qwerasdf': }
}
在Puppet 3.8.5中关闭将来的解析器,这会导致在系统上生成/ tmp / qwerasdf,内容为:
Expected value: <%= @value %>
在Puppet 3.8.5中。在environment.conf中使用Expected value: is the expected value
(以及Puppet 4.x,虽然我在3.8.5未来的解析器环境中专门针对此示例进行了测试),但这会导致使用内容创建文件:
parser = future
编辑3:精确的双字修饰
答案 0 :(得分:1)
在Puppet 3和之前的版本中,从它们的调用类定义继承范围的方式与本机定义类型的方式相同,所以如果我有一个带有由define创建的模板源的文件资源,那么该模板可以使用在无论哪个类叫做define,都在调用类。
你所描述的是Puppet旧的动态范围。范围规则的变化是Puppet 3.0的主要变化之一;它在Puppet 4中并不新鲜。但是,Puppet 3中有a bug模板仍然使用动态范围。这是在Puppet 3.5中修复的,但只是前瞻性的 - 也就是说,未来的解析器启用时。定义类型本身经历了Puppet 3.0.0中的范围更改以及其他所有内容。范围变化是一个大问题(Puppet投入了相当大的努力来提醒用户)当它们第一次到位时,但现在这里没什么大不了的。
它导致在我的环境中难以衡量的破坏,这种行为依赖于成千上万行代码的这种行为。
我很抱歉你有这种经历。
有什么方法可以让它回来吗?
没有。 Puppet范围规则不按您希望的方式工作。他们在Puppet 3中以模板(但不是大多数其他地方)的方式工作过,并且仍然与Puppet的文档相反,而且从不是故意的。
这是可以修复的,还是我试图等待Puppet 5?
没有办法在Puppet 4中的模板或其他地方获得动态变量作用域,我没有理由认为Puppet 5中会有一个。
如果您需要一个模板来扩展特定类范围内的主变量,那么您可以通过评估该类范围内的模板来实现。或者,ERB模板可以从(特定)其他范围by means of the scope
object获取变量。另一方面,如果要在已定义类型的范围内扩展模板,则可以考虑将所需的变量作为该类型的参数传递。
可能还有其他方法可以解决您的问题,但我需要更多详细信息才能提出任何其他建议。 (如果您选择在此处询问,那将构成一个单独的问题。)