所有内容都在清单目录中。
在清单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的错误是
错误:评估错误:评估资源语句时出错,评估错误:找不到资源类型:在...
执行
发布于 2018-06-08 03:40:06
您定义的类型的清单在物理上位于模块(您尚未公开其名称)的清单中,但该类型不是模块的一部分,因为它的名称不在模块的命名空间中。因此,Puppet的加载器将找不到它。你的代码在Puppet 3上也有but,但它似乎受益于一个汇合和松弛的特性。
例如,如果您定义的类型应属于名为"mymodule“的模块,则应在该名称空间中显式声明它:
define mymodule::execute ( ...
并且还应该通过该命名空间引用它:
if defined(Mymodule::Execute["$titlePreviousExecRes"]) {
。通过将您定义的类型放在正确的命名空间中,并通过其完全限定名称引用它来解决您的问题。
至于为什么它似乎在Puppet 3中工作,Puppet语言的版本3假设对未显式锚定到顶级作用域(例如::execute
)的类和类型的引用可能与出现引用的类或类型的命名空间相关(甚至与其他一些类或类型相关)。在您的例子中,自动加载器首先会猜测您对名为Execute
的类型的引用可能是为了引用::mymodule::execute
。由于存在清单mymodule/manifests/execute.pp
,它将对该文件求值,从而获得::execute
类型的定义--而不是它正在查找的::mymodule::execute
。
由于没有找到它正在寻找的类型,自动加载器将在其他命名空间中搜索,直到最终尝试顶级范围。然而,当它到达那里时,它会发现它已经有了它从模块中的清单中获得的top-scope定义,所以加载程序将会成功,因为它提供了这个错误的定义。但这只适用于同一模块中的引用,并且存在严重的冲突风险。
Puppet 5的自动加载器在定位类和定义的类型定义时仍然表现出一些后备行为,但是Puppet不再识别相对的类和定义的类型名称。因此,当试图解析对类型execute
的引用时,自动加载器从不考虑计算mymodule/manifests/execute.pp
,因为它期望在那里找到::mymodule::execute
,而不是它要查找的类型::execute
。
因此,不,您的定义永远不会被定位或加载。这是一个特性,而不是一个bug。
https://stackoverflow.com/questions/50741812
复制相似问题