首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在模块中,使用定义的资源在puppet3中工作,但在puppet5中失败

在模块中,使用定义的资源在puppet3中工作,但在puppet5中失败
EN

Stack Overflow用户
提问于 2018-06-07 20:56:33
回答 1查看 382关注 0票数 1

所有内容都在清单目录中。

在清单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的错误是

错误:评估错误:评估资源语句时出错,评估错误:找不到资源类型:在...

执行

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50741812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档