木偶-创建NESTED自定义事实

时间:2018-06-24 08:56:17

标签: ruby hashmap puppet facter

我已经成功创建了.rb自定义事实,该自定义事实分析了内置事实以创建新值,但是我现在尝试将其用作Puppet的嵌套自定义事实。

我要创建的层次结构类似于内置事实,例如运行Facter(或Facter -p)将显示:

custom_parent => {
  custom_fact_1 => whatever
  custom_fact_2 => whatever2
}

在木偶清单中的用法是:

$custom_parent.custom_fact_1

到目前为止,我已经尝试了以下主要语法:

Facter.add (:custom_parent)=>(custom_fact_1) do
Facter.add (:custom_parent)(:custom_fact_1) do
Facter.add (:custom_parent.custom_fact_1) do
Facter.add (:custom_parent:custom_fact_1) do
Facter.add (custom_parent:custom_fact_1) do

...但是许多其他变体无法创建嵌套的自定义事实数组。我已经搜索了一段时间,如果有人知道是否有可能,我将非常感激。

我确实发现可以使用/etc/puppetlabs/facter/facts.d/目录中的.yaml文件中的数组来创建嵌套事实,如下所示,但是这会设置FIXED值,并且不会处理我需要的逻辑根据我的习惯事实。

{
  "custom_parent":
  {
    "custom_fact_1": "whatever",
    "custom_fact_2": "whatever2",
  }
}

谢谢。

2 个答案:

答案 0 :(得分:2)

  

我要创建的层次结构类似于内置事实,例如   运行Facter(或Facter -p)将显示:

join

没有“嵌套”事实。但是,存在“结构化”事实,这些事实可能具有哈希值。在一定程度上,Facter提供了您描述为“嵌套”的输出,这肯定是您要查看的内容。

由于结构化事实的价值要素本身并不是事实,因此需要在事实本身的解决方案中指定它们:

custom_parent => {
  custom_fact_1 => whatever
  custom_fact_2 => whatever2
}

Facter.add (:custom_parent) do { :custom_fact_1 => 'whatever', :custom_fact_2 => 'whatever2', } end whatever不必是文字字符串;它们可以是或多或少的任意Ruby表达式。当然,您也可以将成员与创建哈希值分开设置(但以相同的事实分辨率):

whatever2

答案 1 :(得分:0)

谢谢@John Bollinger。您的示例非常接近,但是我发现我需要使用type => aggregate和chunk才能使其正常工作。我还将它与定义的函数结合在一起,最终结果基于下面的代码。

如果您有任何其他建议可改善此代码的代码一致性,请随时指出。干杯

# define the function to process the input fact
def dhcp_octets(level)
  dhcp_split = Facter.value(:networking)['dhcp'].split('.')
  if dhcp_split[-level..-1]
    result = dhcp_split[-level..-1].join('.')
    result
  end
end

# create the parent fact
Facter.add(:network_dhcp_octets, :type => :aggregate) do
  chunk(:dhcp_ip) do
    value = {}

# return a child => subchild array
    value['child1'] = {'child2' => dhcp_octets(2)}

# return child facts based on array depth (right to left)
    value['1_octets'] = dhcp_octets(1)
    value['2_octets'] = dhcp_octets(2)
    value['3_octets'] = dhcp_octets(3)
    value['4_octets'] = dhcp_octets(4)

# this one should return an empty fact
    value['5_octets'] = dhcp_octets(5)
    value
  end
end