Я пытаюсь получить несколько структурированных 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