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

Puppet 在同一模块和不同清单中调用函数,puppet,puppet-enterprise,Puppet,Puppet Enterprise,我已经创建了其他文件来分配主木偶文件上的负载。我希望这些附加文件以某种格式返回字符串,因此创建了一个函数。在具有多个函数的多个文件中,我希望从主文件调用这些函数并获得结果 util.pp functions mymodule::retrieveData() >> String { .. "${results}" } 主文件: include util.pp $items = mymodule::retrieveData() 结构 manifest - mai

我已经创建了其他文件来分配主木偶文件上的负载。我希望这些附加文件以某种格式返回字符串,因此创建了一个函数。在具有多个函数的多个文件中,我希望从主文件调用这些函数并获得结果

util.pp

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

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

manifest
  - main.pp
  - util.pp
这些问题:

  • 正在获取对主puppet文件中函数的访问权限
    include util.pp
    似乎没有加载该文件。错误:
    找不到class::util
  • 调用
    retrieveData()
    获取字符串结果以存储在
    $items

  • 您有多个问题,其中包括:

  • (微不足道)您在函数定义中拼错了关键字
    function
  • (微不足道)您声称您的清单位于名为“manifest”的目录中。如果这是真的,那就错了;用于定义类和定义类型的清单的文件夹应命名为“清单”。(另见下文。)
  • 您对包含函数定义的文件的命名不正确。文件名应与函数名相对应:
    retrieveData.pp
    。因此,每个函数都必须放在自己的文件中
  • 您将包含函数定义的文件放置在错误的位置。模块中的
    manifests/
    文件夹用于提供类定义和定义类型(仅限)的文件,提供Puppet语言函数定义的文件位于名为
    functions/
    的目录的同级目录中
  • include
    语句用于使类包含在正在构造的目录中。这与源文件无关。如果您试图声明一个类,那么它希望您提供所需类的名称,而不是文件名。在任何情况下,
    include
    语句在访问函数时都不起作用,您不应该尝试将其用于函数
  • 总的来说,在正确的名称空间中声明函数(显然已完成),相应地命名其文件,将该文件放在该名称空间中函数的正确位置,并在调用该函数时通过其正确的名称和名称空间引用该函数


    更新

    function mymodule::retrieveData() >> String {
      "some data"
    }
    
    class mymodule {
      $data = mymodule::retrieveData()
      notify { "The data are: '${data}'": }
    }
    
    由于对上述含义似乎缺乏明确性,以下是一个具体的例子:

    mymodule/functions/retrieveData.pp

    function mymodule::retrieveData() >> String {
      "some data"
    }
    
    class mymodule {
      $data = mymodule::retrieveData()
      notify { "The data are: '${data}'": }
    }
    
    mymodule/manifests/init.pp

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

    注意:你问题的标题掩盖了对木偶术语的误解。“清单”或“清单文件”是包含用Puppet语言编写的代码的文件。所有清单文件名称的标准后缀为“.pp”。可能你的意思是“在同一个模块和不同的清单中调用一个函数”,尽管Puppet函数总是在它们自己的文件中定义,所以“和不同的清单”部分是无关的。这很有意义,谢谢。我将更新问题标题。我现在将
    retrieveData.pp
    放在
    functions
    文件夹中,与
    清单
    处于同一级别。函数名与文件名相同
    函数myModule::retrieveData()>>字符串
    。我不确定如何从
    清单中的
    puppet
    文件调用它folder@miqdadamirali,如我所说,只需通过其命名空间限定名调用函数。您问题中示例代码中的调用似乎具有正确的形式。只需省略
    include
    语句。我确实省略了它,并将调用保持为
    $items=mymodule::retrieveData()
    。我得到以下错误
    评估错误:未知函数:myModule::retrieveData
    在您声称进行的调用和您声称收到的错误消息之间,大小写不匹配。他们不在一起。但这可能会指出问题所在:您需要在模块名称的大小写上处处保持一致(根据资源引用和类型名称中必须使用的特定大小写更改)。这听起来像是一个bug。Puppet历史上在标识符字符的大小写方面有一些奇怪的缺点,但根据文档,最新版本允许混合大小写(和区分大小写),但某些类型构造的标识符的第一个字符除外。不过,就我个人而言,我很谨慎,我的名字中任何地方都避免使用大写字母。