我正在构建一个自定义类型,我无法从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)
在节点清单中.这也可以解决问题,但我们正在开发一个模块,主要清单超出了我们的范围
您无法从提供程序访问 hiera 数据,因为提供程序运行代理端,而 hiera 运行主端。
您在评论中提到您运行无主,这是无关紧要的,因为仍然有一个“主”运行,它编译 Puppet 目录并评估 hiera 值,以及一个“代理”运行,它使用提供程序应用目录。
想象一下 Puppet 的运行分为一系列步骤:
因此,最好的选择是将提供程序包装在定义类型中。使用定义类获取 hiera 默认值并将它们传递给提供者,同时允许覆盖默认值。