【发布时间】:2017-02-27 15:30:22
【问题描述】:
在 Puppet 3 和之前的版本中,模板从调用类定义继承范围的方式与本机定义类型的方式相同,因此,如果我有一个文件资源,其中包含由定义创建的模板源,则该模板可以使用变量集在调用类中,无论哪个类调用了define。
在 Puppet 4 中(也使用 Puppet 3.8 未来解析器进行了测试),这似乎不再是这种情况,并且它导致在我的环境中甚至难以测量的损坏,我的环境依赖这种行为数以万计的代码行。有什么办法可以把它找回来吗?经过研究,即使将定义转换为本机类型也不能解决问题,因为它们依赖于收集服务器端信息的能力,这些信息包括通过自定义函数在不同模块中可用的模板,以及本机资源类型中的所有内容似乎发生在客户端上。
这是可以修复的,还是我尝试等待 Puppet 5?
编辑:这里不要太拘泥于“范围”这个词——我需要任何方法将所有类变量传递给一个定义并在那里解压它们,以便它们可用于模板,或者有一种方法原生类型查看 puppetmaster 上指定模块内的文件。只要有这个结果,我就会接受任何奇怪、晦涩的消息传递选项,因为类不知道模板在哪里——只有定义知道,因为它使用了辅助函数扫描服务器上的文件系统。
编辑 2:要证明这在 Puppet 3.8.5 中按预期工作,请使用以下内容:
modules/so1/manifests/autotemplate.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),
}
}
在模块/so2/manifests/example.pp:
# Example class calling so1::autotemplate
class so2::example (
$value = 'is the expected value'
) {
so1::autotemplate { '/tmp/qwerasdf': }
}
在模块/so2/templates/tmp/qwerasdf:
Expected value: <%= @value %>
在关闭未来解析器的 Puppet 3.8.5 中,这会导致在系统上生成 /tmp/qwerasdf,其内容如下:
Expected value: is the expected value
在 Puppet 3.8.5 中。使用 environment.conf 中的parser = future(还有 Puppet 4.x,尽管我专门在 3.8.5 未来的解析器环境中测试了这个示例),这会导致文件的内容被创建:
Expected value:
编辑 3:精确的两个字修饰
【问题讨论】:
-
人们无法避免关注“范围”,因为这不仅是您使用的词,而且是您正在讨论的概念的正确词。因此,您的编辑似乎试图改变问题以提出与以前大不相同的问题。冒着听起来自私自利的风险,您不应该在收到答复后这样做。
-
问题是标题中的问题——如何将所有调用类变量添加到已定义类型的范围内。其余的只是背景——在 Puppet 3 中,这是自动发生的,一直到 3.8.5。我不需要它在 Puppet 4 中是自动的——我只需要它是可能的。
-
标题中问题的答案还是我写的(更新后的)。 Puppet 3 中定义的类型从不从 using 类的作用域中获取变量。模板确实如此,但这是一个错误,尽管仅在 Puppet 4 中修复了一个错误,并且在 Puppet 3 中启用了未来的解析器时。您可以通过定义类型的参数将数据从调用类传递给定义的类型,并且模板可以访问通过其
scope对象从外部范围获取数据。没有理由认为这会在 Puppet 5 中发生变化。
标签: puppet