7

我正在构建一个自定义类型,但无法从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

但我明白了

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')
}

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

4

1 回答 1

2

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

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

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

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

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

于 2016-03-06T04:44:24.700 回答