首页 > 解决方案 > 如何从与其定义的模块不同的模块调用木偶函数

问题描述

check_value在模块中定义了一个木偶函数test_one

test_one
 |- functions
     |- check_value.pp

和函数声明:

test_one::check_value(String $check) >> String {
    ...
}

test_functions我在同一个模块中声明了一个类。

test_one
 |- functions
     |- check_value.pp
 |- manifests
     |- test_functions.pp

一切似乎都很完美,我可以check_value从同一个模块中的类调用这个函数test_functions并获取返回值。

但是,如果我从另一个模块调用这个函数,我会得到Evaluation Error: Unknown function: ...

test_two
 |- manifests
     |- test_external_function.pp

在课堂test_external_function上,我尝试了几种调用方式,check_value但都没有成功:

1. $x = test_one::check_value("t")


2. include test_one
   $x = check_value("t")  


3. include test_one
   $x = test_one::check_value("t")

所有的试验都失败了。是否可以从另一个模块调用和使用这些 puppet(非 ruby​​)函数?我似乎找不到办法。谷歌到目前为止没有任何帮助!

根据 puppet 文档,有可能: Puppet Functions

除非这些模块指定依赖关系,否则函数会自动加载并可供其他模块使用。一旦函数被编写并可用(在自动加载器可以找到它的模块中),您可以在将包含模块列为依赖项的任何 Puppet 清单中调用该函数,也可以从您的主清单中调用该函数。

标签: functionmodulepuppetmanifest

解决方案


这是由于此处记录的 Puppet 编码中引入了一个相对较新的要求。具体来说:

请注意,如果一个模块在其 metadata.json 文件中有一个依赖项列表,它只会从那些特定的依赖项中加载自定义函数。

通常,通过 PDK 生成模块或puppet module generate将创建一个占位符metadata.json作为puppetlabs/stdlib依赖项。这在实践中通常很好,但它会破坏从其他模块自动加载自定义函数。

在这种情况下(我猜您通常也会根据最佳实践说),您可能希望使用您正在调用的自定义函数指定其他模块作为metadata.json模块的依赖项。例如,在 中test_two/metadata.json,您可能有如下内容:

"dependencies": [
  { "name": "org_name/test_one", "version_requirement": ">= 1.0.0 < 2.0.0" },
]

在此处提供有关指定依赖项的完整文档。


推荐阅读