Создание вложенного факта Puppet (Ruby) путем итерации по выводу запроса gem - PullRequest
0 голосов
/ 04 января 2019

У меня есть рабочий код Ruby для запроса подробностей DNS и создания пользовательских фактов Puppet (puppet 5, Facter 3.11.6), однако я пытаюсь изменить его для создания вложенных фактов из пар ключ / значение, которые получает запрос.

Код, который работает для установки отдельных фактов с помощью имени ключа:

  require 'resolv'
  Resolv::DNS::Config.default_config_hash.each do | key, value |
    if !value.nil?
      Facter.add("dns_#{key}") do
        if value.is_a?(Array)
          setcode { value.join(',') }
        else
          setcode { value }
        end
      end
    end
  end

, который создает отдельные факты таким образом:

dns_nameserver => 192.168.1.1,192.168.1.2
dns_ndots => 1
dns_search => test.domain

Моя неудачная попытка создать вложенноефакт в родительском факте «DNS»:

require 'resolv'
Facter.add("dns") do
  value ={}
  Resolv::DNS::Config.default_config_hash.each do | key, result |
    if !result.nil?
      if result.is_a?(Array)
        setcode { value['#{key}'] = result.join(',') }
      else
        setcode { value['#{key}'] = result }
      end
    end
  end
end

, что дает ограниченный результат, равный просто:

dns => 1

Другой код, который я пробовал, кажется, помещает вывод массива встрока и несколько IP-адресов заключаются в квадратные скобки в 2 строки вместо вывода в соответствии с первым блоком кода в верхней части страницы.

Структура факта, которой я пытаюсь достичь (изменяя верхнюю частькод страницы):

dns => {
  nameserver => 192.168.1.1,192.168.1.2,
  ndots => 1,
  search => test.domain,
}

Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 04 января 2019

Я, наконец, получил это с помощью автора, который разместил здесь несколько отличных кодовых ссылок, но, к сожалению, вскоре удалил их.Вот код, который работает:

require 'resolv'
Facter.add(:networking_dns) do
  setcode do
    Resolv::DNS::Config.default_config_hash.each_with_object({}) do | (key, value), sub|
      if !value.nil?
        sub[key] = value
        sub
      end
    end
  end
end

Теперь для некоторых пояснительных замечаний (пожалуйста, не стесняйтесь исправлять меня или предлагать любые оптимизации):

# the resolv gem is required
require 'resolv'
# create the parent fact (has no value of its own)
Facter.add(:networking_dns) do
# start building instructions in the fact
  setcode do
# use the resolv gem to lookup values in /etc/resolv.conf and add .each to process all key/value pairs returned
# also add _with_object({}) and sub in the variables to set a blank value for sub.  Saves doing it separately.  Sub can be any name but denotes the declaration for the nested facts
    Resolv::DNS::Config.default_config_hash.each_with_object({}) do | (key, value), sub|
# create facts only when the value is not nil
      if !value.nil?
        sub[key] = value
        sub
# using a closing blank entry for a nested fact is critical or they won't create!  Place this outside of the case statement to prevent blank values
      end
    end
  end
end
# use the appropriate number of ends and indent for readability

Спасибо человеку, которыйразместил свои рекомендации здесь, прежде чем удалить его.Я хотел бы поддержать вас, если вы напишете снова.

Любые советы по оптимизации подходящего решения приветствуются, так как я все еще цепляюсь за Руби (потратил на это часы!)

...