добавить несколько структурированных пользовательских фактов - PullRequest
2 голосов
/ 10 июля 2019

Я пытаюсь получить несколько структурированных custom facts для добавления к моему корневому ключу (здесь он называется rag), но вместо этого они всегда заменяют текущее значение.

Q1: Это ожидаемое поведение Facter.add?

Итак, чтобы заставить его работать, я создал два external facts, а на custom fact я просто читаю их результаты и добавляю к корню с type => :aggregate

Я получаю ожидаемый результат:

: ~ # facter -p rag

{
  role => "win-mbox",
  ambiente => "producao",
  enabled_services => [
    "auditd",
    "lvm2-monitor",
    "mdmonitor",
    "rhsmcertd",
    "rsyslog",
    "sshd",
    "syslog",
    "sysstat",
  ]
}

Я разбиваю его на несколько файлов для лучшего обслуживания (каждый скрипт выводит 1 ключ), но я чувствую, что должен быть лучший способ.

Q2: есть ли лучший способ? Я имею в виду, что нет необходимости использовать пользовательский факт только для чтения значений внешних фактов и добавления.

Ниже подробно о коде:

/ Opt / puppetlabs / кукольный / кэш / facts.d / rag_system_services.rb

#!/usr/bin/env ruby

require 'facter'
require 'json'

retorno   = Hash.new { |h,k| h[k] = Hash.new(&h.default_proc) }
os_family = Facter.value(:osfamily)

if os_family == 'RedHat'
    retorno[:rag_system_services] = `systemctl list-unit-files --no-legend --no-pager -t service --state=enabled`.scan(/(^.+?)\.service\s+enabled/i).flatten
else
    retorno[:rag_system_services] = `rcconf --list | sort`.scan(/(^.+?)\s+on/i).flatten
end

puts JSON.pretty_generate(retorno)

/ опт / puppetlabs / кукольный / кэш / facts.d / rag_role.rb

#!/usr/bin/env ruby

require 'facter'
require 'json'

retorno = Hash.new { |h,k| h[k] = Hash.new(&h.default_proc) }
fqdn    = Facter.value(:fqdn)

retorno[:rag_role] = if fqdn.start_with? 'win-'
    case fqdn
        when /-aio/    then 'win-aio'
        when /-ldap/   then 'win-ldap'
        when /-logger/ then 'win-logger'
        when /-mbox/   then 'win-mbox'
        when /-mta/    then 'win-mta'
        when /-proxy/  then 'win-proxy'
    end
elsif fqdn.include? 'lnx-'
    case fqdn
        when /balancer/ then 'lnx-balancer'
        when /database/ then 'lnx-database'
        when /nfs/      then 'lnx-nfs'
        when /server/   then 'lnx-server'
    end
else
    case fqdn
        when /^dns-/         then 'dns'
        when /^elastic-/     then 'elastic'
        when /^pre-auth/     then 'pre-auth'
        when /^puppetserver/ then 'puppetserver'
    end
end

puts JSON.pretty_generate(retorno)

/ опт / puppetlabs / кукольный / кэш / Библиотека / facter / rag.rb

Facter.add(:rag, :type => :aggregate) do

    chunk(:ambiente) do
        rag = {}
        rag['ambiente'] = (Facter.value(:fqdn).include? 'hom-') ? 'homologacao' : 'producao'
        rag
    end

    chunk(:enabled_services) do
        rag = {}
        rag['enabled_services'] = Facter.value(:rag_system_services)
        rag
    end

    chunk(:role) do
        rag = {}
        rag['role'] = Facter.value(:rag_role)
        rag
    end

end
...