从Puppet自定义类型

时间:2016-02-01 11:24:55

标签: puppet hiera

我正在构建自定义类型,但我无法从默认块访问 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')
}

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

1 个答案:

答案 0 :(得分:2)

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

你已经提到你在评论中没有主人,这是无关紧要的,因为还有一个"主人"运行编译Puppet目录并评估hiera值和"代理"运行使用提供程序应用目录。

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

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

所以最好的办法是将提供程序包装在一个define类型中。使用define类获取hiera默认值并将它们传递给提供者,同时允许覆盖默认值。