Как я могу быстро и легко заявить, что нулевое / пустое значение подходит для факта в марионетке?
При сборке пользовательского факта я делаю примерно следующее:
/ марионетка / производство / модули / хосты / библиотека / фактер
Facter.add(:hostslocal) do
setcode do
Facter::Util::Resolution.exec("cat /etc/hosts.local 2> /dev/null")
end
end
Это работает отлично, за исключением случаев, когда файл не существует, и в этом случае он взорвется чем-то вроде следующего при использовании в Puppet.
Detail: Could not find value for 'hostslocal'
Мне удалось обойти это с помощью чего-то вроде «если файл не существует, напишите строку, содержащую только комментарий», но это кажется глупым.
У Facter есть множество фактов, которые устанавливаются только при определенных обстоятельствах. Перед их использованием вы должны проверить, не определены ли они.
if $::hostslocal != undef {
do_your_thing_here
}
Если вы действительно хотите, чтобы ваш пользовательский факт всегда имел ценность, вы можете сделать что-то вроде
Facter.add(:hostslocal) do
setcode do
if File.exist? "/etc/hosts.local"
Facter::Util::Resolution.exec("cat /etc/hosts.local 2> /dev/null")
else
"unknown"
end
end
end
При написании таких нестандартных фактов в вашем распоряжении мощь Ruby. Так что просто проверьте, существует ли данный файл, прежде чем выполнять действие exec. Что-то вроде:
Facter.add(:hostslocal) do setcode do if File.exist? "/etc/hosts.local" Facter::Util::Resolution.exec("cat /etc/hosts.local 2> /dev/null") end end end
Конечно, не проверено, но это должно быть то направление, в котором вы хотите двигаться. Посмотри на http://docs.puppetlabs.com/guides/custom_facts.html для получения дополнительных сведений о пользовательских фактах.