在同一模块和不同清单中调用函数

Calling a function in the same module and different manifest

我已经创建了额外的文件来分担主人偶文件的负载。我希望这些附加文件 return 某种格式的字符串,因此创建了一个函数。在具有多个函数的多个文件中,我想从主文件中调用这些函数并获取结果。

util.pp

functions mymodule::retrieveData() >> String {
   ..   
  "${results}" 
}

主文件:

include util.pp
$items = mymodule::retrieveData()

结构

manifest
  - main.pp
  - util.pp

问题:

  1. 正在访问主 puppet 文件中的函数。 include util.pp 似乎没有加载文件。错误:Could not find class ::util
  2. 正在调用 retrieveData() 获取要存储在 $items 中的字符串结果

您有多个问题,其中:

  1. (微不足道)您在函数定义中拼错了关键字 function
  2. (琐碎)您声称您的清单位于名为 "manifest" 的目录中。如果这是真的,那将是不正确的;用于定义 classes 和已定义类型的清单的文件夹应命名为 "manifests"。 (另见下文。)
  3. 您错误地命名了包含函数定义的文件。文件名应对应函数名:retrieveData.pp。因此每个函数都必须放在自己的文件中。
  4. 您将包含函数定义的文件放在了错误的位置。模块中的 manifests/ 文件夹用于提供 classes 和定义类型(仅)定义的文件。 Per the documentation,提供 Puppet 语言函数定义的文件位于名为 functions/.
  5. 的同级目录中
  6. include语句是为了使classes包含在正在构建的目录中。它与源文件无关。如果您尝试声明一个 class,那么它希望您提供所需 class 的名称,而不是文件名。在任何情况下,include 语句在访问函数中没有任何作用,您不应该尝试将它与它们一起使用。

总体而言,在正确的命名空间中声明您的函数(显然已完成),相应地命名其文件,将文件放在该命名空间中函数的正确位置,并在您使用时通过正确的名称和命名空间引用该函数叫它。


更新:

由于上面的意思似乎有些不清楚,这里有一个具体的例子:

mymodule/functions/retrieveData.pp:

function mymodule::retrieveData() >> String {
  "some data"
}

mymodule/manifests/init.pp:

class mymodule {
  $data = mymodule::retrieveData()
  notify { "The data are: '${data}'": }
}