Назад | Перейти на главную страницу

Нулевые / пустые значения в фактах марионетки

Как я могу быстро и легко заявить, что нулевое / пустое значение подходит для факта в марионетке?

При сборке пользовательского факта я делаю примерно следующее:

/ марионетка / производство / модули / хосты / библиотека / фактер

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