Кукольный - создай НЕСТАДНЫЙ пользовательский факт - PullRequest
0 голосов
/ 24 июня 2018

Я успешно создал пользовательский факт .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

... и многие другие варианты, однако не могут получить вложенный массив пользовательских фактов для создания.Я гуглил некоторое время, и если кто-нибудь знает, возможно ли это, я был бы очень признателен.

Я обнаружил, что вложенные факты могут быть созданы с использованием массива в файле .yaml в / etc / puppetlabs/facter/facts.d/, как показано ниже, однако он устанавливает ИСПРАВЛЕННЫЕ значения и не обрабатывает логику, которая мне нужна в моем пользовательском факте.

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

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Спасибо, @ Джон Боллинджер.Ваш пример был очень близок, однако я обнаружил, что мне нужно использовать 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
0 голосов
/ 25 июня 2018

Иерархия, которую я хочу создать, похожа на встроенные факты, например запуск Facter (или Facter -p) будет показывать:

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

Нет "вложенных" фактов. Однако существуют «структурированные» факты, которые могут иметь хеш-значения в качестве своих значений. В той степени, в которой Facter представляет вывод, который вы характеризуете как «вложенный», это, безусловно, то, на что вы смотрите.

Поскольку элементы значения структурированного факта не являются фактами сами по себе, их необходимо указать в разрешении самого факта:

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
...