从Puppet自定义类型访问hiera范围

Rau*_*res 7 puppet hiera

我正在构建一个自定义类型,我无法从defaultto块访问hiera范围

module Puppet
  require 'puppet/parser/functions/hiera' 
  newtype(:my_type) do

    ensurable

    newparam(:myparam) do
      defaultto { Puppet::Parser::Functions.hiera('myparam') }
    end
    newproperty(:value) do
        desc "Value of the item."
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但我明白了

Error: undefined method `hiera' for Puppet::Parser::Functions:Module
Run Code Online (Sandbox Code Playgroud)

我实际上正在使用Puppet 3.8和未来的解析器

作为一种解决方法,我们使用

  $my_vals = hiera_hash('mytype_vals')
  create_resource(my_type, $myvals, {myparam => hiera('myparam')})
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但是my_type期望在目录中的任何地方实例化对象,并且预期myparam所有实例中的对象都是相同的.因此,不需要多个默认值声明.

另一种方法是放置

My_type{
  myparam => hiera('myparam')
}
Run Code Online (Sandbox Code Playgroud)

在节点清单中.这也可以解决问题,但我们正在开发一个模块,主要清单超出了我们的范围

Rob*_*obo 2

您无法从提供程序访问 hiera 数据,因为提供程序运行代理端,而 hiera 运行主端。

您在评论中提到您运行无主,这是无关紧要的,因为仍然有一个“主”运行,它编译 Puppet 目录并评估 hiera 值,以及一个“代理”运行,它使用提供程序应用目录。

想象一下 Puppet 的运行分为一系列步骤:

  • 代理向主人发送事实列表
  • Master 编译站点清单以查找要包含在节点中的类列表
  • Master评估所有参数和hiera变量
  • Master将模块编译成目录
  • 主站将目录发送给代理
  • 代理通过向提供者提供参数来应用目录

因此,最好的选择是将提供程序包装在定义类型中。使用定义类获取 hiera 默认值并将它们传递给提供者,同时允许覆盖默认值。