全部位于舱单目录中。
在manifest execute.pp 中,我有:
define execute (
String $command = "echo",
String $workdirectory = "/tmp",
String $runas = "www",
Boolean $failonerror = true
) {
# Resources
require stdlib
etc ...
使用它的代码:
....
if defined(Execute["$titlePreviousExecRes"]) {
....
puppet5的错误是
错误:评估错误:评估资源报表时出错,评估错误:未找到资源类型:执行于...
答案 0 :(得分:3)
您定义的类型的清单实际位于模块(其名称未公开)的模块中,但该类型不是模块的一部分,因为它的名称不在模块中#& 39; s命名空间。结果,Puppet的加载器将无法找到它。你的代码对于Puppet 3来说也是错误的,但它似乎从松散特征的融合中获益。
如果您定义的类型应该属于名为" mymodule"的模块,那么它应该在该命名空间中显式声明:
define mymodule::execute ( ...
并且它也应该通过该命名空间引用:
if defined(Mymodule::Execute["$titlePreviousExecRes"]) {
。通过将您定义的类型放在正确的命名空间中,并通过其完全限定名称引用它来解决您的问题。
至于为什么它似乎在Puppet 3中起作用,Puppet语言的第3版假定对未明确锚定到顶部范围的类和类型的引用(例如::execute
)可能 relative < / em>到引用出现的类或类型的命名空间(甚至是其他一些)。在您的情况下,自动加载器会首先猜测您对名为Execute
的类型的引用可能是为了引用::mymodule::execute
。看到清单mymodule/manifests/execute.pp
存在,它将评估该文件,从而获得类型::execute
的定义 - 而不是它正在寻找的::mymodule::execute
。
如果没有找到它正在寻找的类型,自动加载器将搜索其他名称空间,直到最终尝试顶级作用域。然而,当它到达那里时,它会发现它已经从模块中的清单中获得了顶级范围的定义,因此加载器将成功,提供错误的定义。但这只适用于同一模块中的引用,并且存在严重的冲突风险。
Puppet 5的自动加载器仍然表现出一些用于定位类和定义的类型定义的回退行为,但Puppet不再识别相对类和定义的类型名称。因此,在尝试解析您对execute
类型的引用时,自动加载器从不考虑评估mymodule/manifests/execute.pp
,因为它预期会找到::mymodule::execute
,而不是它的类型&# 39; s正在寻找,::execute
。
因此,不,您的定义永远不会被定位或加载。这是一个功能,而不是错误。