Puppet - 创建嵌套自定义事实
Puppet - create NESTED custom fact
我已经成功创建了一个 .rb 自定义事实,它解析一个内置事实以创建一个新值,但是我现在正试图将它用作 nested 自定义事实傀儡.
我要创建的层次结构类似于内置事实,例如 运行 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
...和许多其他变体但是无法创建嵌套的自定义事实数组。我用 Google 搜索了一段时间,如果有人知道是否可行,我将不胜感激。
我确实发现可以使用 /etc/puppetlabs/facter/facts.d/ 目录中的 .yaml 文件中的数组创建嵌套事实,如下所示,但是这会设置 FIXED 值并且不会处理我需要的逻辑我的自定义事实。
{
"custom_parent":
{
"custom_fact_1": "whatever",
"custom_fact_2": "whatever2",
}
}
提前致谢。
The hierarchy I want to create is similar to built-in facts, eg
running Facter (or Facter -p) would show:
custom_parent => {
custom_fact_1 => whatever
custom_fact_2 => whatever2
}
没有 "nested" 个事实。但是,有 "structured" 个事实,并且这些事实可能具有散列值作为它们的值。就 Facter 呈现您描述为 "nested" 的输出而言,这肯定是您正在查看的内容。
由于结构化事实值的元素本身并不是事实,因此需要在事实本身的解析中指定它们:
Facter.add (:custom_parent) do
{
:custom_fact_1 => 'whatever',
:custom_fact_2 => 'whatever2',
}
end
whatever
和whatever2
不需要是文字串;它们可以或多或少是任意 Ruby 表达式。当然,你也可以在创建散列时单独设置成员(但在同一个事实解析中):
Facter.add (:custom_parent) do
value = new Hash()
value[:custom_fact_1] = 'whatever'
value[:custom_fact_2] = 'whatever2'
value
end
谢谢@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
我已经成功创建了一个 .rb 自定义事实,它解析一个内置事实以创建一个新值,但是我现在正试图将它用作 nested 自定义事实傀儡.
我要创建的层次结构类似于内置事实,例如 运行 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
...和许多其他变体但是无法创建嵌套的自定义事实数组。我用 Google 搜索了一段时间,如果有人知道是否可行,我将不胜感激。
我确实发现可以使用 /etc/puppetlabs/facter/facts.d/ 目录中的 .yaml 文件中的数组创建嵌套事实,如下所示,但是这会设置 FIXED 值并且不会处理我需要的逻辑我的自定义事实。
{
"custom_parent":
{
"custom_fact_1": "whatever",
"custom_fact_2": "whatever2",
}
}
提前致谢。
The hierarchy I want to create is similar to built-in facts, eg running Facter (or Facter -p) would show:
custom_parent => { custom_fact_1 => whatever custom_fact_2 => whatever2 }
没有 "nested" 个事实。但是,有 "structured" 个事实,并且这些事实可能具有散列值作为它们的值。就 Facter 呈现您描述为 "nested" 的输出而言,这肯定是您正在查看的内容。
由于结构化事实值的元素本身并不是事实,因此需要在事实本身的解析中指定它们:
Facter.add (:custom_parent) do
{
:custom_fact_1 => 'whatever',
:custom_fact_2 => 'whatever2',
}
end
whatever
和whatever2
不需要是文字串;它们可以或多或少是任意 Ruby 表达式。当然,你也可以在创建散列时单独设置成员(但在同一个事实解析中):
Facter.add (:custom_parent) do
value = new Hash()
value[:custom_fact_1] = 'whatever'
value[:custom_fact_2] = 'whatever2'
value
end
谢谢@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