我正在构建一个自定义类型,但我无法从默认块访问 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
但我得到
Error: undefined method `hiera' for Puppet::Parser::Functions:Module
我实际上正在使用Puppet 3.8和未来的解析器
作为解决方法,我们使用
$my_vals = hiera_hash('mytype_vals')
create_resource(my_type, $myvals, {myparam => hiera('myparam')})
这工作正常,但my_type
对象应在目录中的任何位置实例化,则myparam
应在所有实例中相同。因此,不需要多个默认值声明。
另一种方法是放置
My_type{
myparam => hiera('myparam')
}
在节点清单中。这也可以解决问题,但我们正在开发一个模块,主清单超出了我们的范围
您无法从提供程序访问 hiera 数据,因为提供程序运行代理端,而 hiera 运行主机端。
您在评论中提到您运行无主,这无关紧要,因为仍然有一个编译 Puppet 目录并评估 hiera 值的"master"运行和一个使用提供程序应用目录的"代理"运行。
将木偶运行想象为一系列步骤:
- 代理向主发送事实列表
- Master 编译站点清单以查找要为节点包含的类列表
- 主站评估所有参数和 hiera 变量
- Master 将模块编译到目录中
- 主设备将目录发送给代理
- 代理通过将参数提供给提供程序来应用目录
因此,最好的办法是将提供程序包装在定义类型中。使用 define 类获取 hiera 默认值并将其传递给提供程序,同时允许覆盖默认值。