Кукольный: все пользовательские факты получают все результаты

Я пытаюсь найти в Puppet способ получения текущих значений емкости zpool для моих серверов хранения FreeBSD, сохранения их в пользовательских фактах и ​​генерации оповещения, если емкость достигает "слишком высокого" уровня. Ближайшее совпадение с моей проблемой, которую я нашел до сих пор, это: Возвращение нескольких пользовательских фактов с помощью Puppet Facter.

Это указало мне на это решение:

operatingsystem = Facter.value('operatingsystem')
case operatingsystem
when "FreeBSD"

  present_zpools = IO.popen('zpool list -H -o name').read.chomp            
  if ! present_zpools.empty?

    Facter.add(:zpools) do
      setcode do
        zpools = IO.popen('for i in $(zpool list -H -o name); do echo $i; done').read.chomp.split("\n")
      end
    end

    def addZpoolCapacityFact(zpool)
      zpool_capacity = IO.popen('zpool get -H -o value capacity #{zpool}').read.tr('%','').chomp

      Facter.add("capacity_" + zpool) do
        setcode do
          zpool_capacity
        end
      end

    end                                                                                                    

    zpools = Facter.value(:zpools)
    zpools.each do |zpool|
      addZpoolCapacityFact(zpool)
    end

  end

end

Но не вполне дает ожидаемый результат, например:

capacity_pool1: 10 30
capacity_pool2: 10 30

Когда я действительно ожидал:

capacity_pool1: 10
capacity_pool2: 30

Что я делаю неправильно?

1 ответ

ОК, решено!

Проблема заключалась в использовании IO.popen два раза в одном и том же скрипте, хотя я и пытался обнулить переменные, первая функция разбиения, примененная к переменной "zpools", была также запущена для "zpool_capacity", я думаю, что результат выглядел как:

"capacity_pool1":"10\n12","capacity_pool2":"10\n12"

Обратите внимание на '\n' между числами? Я уверен, что есть Ruby-способ иметь возможность использовать IO.popen несколько раз, но я не знаю как, поэтому я просто изменил команды для выполнения с простыми обратными галочками (`) и вот рабочий код:

operatingsystem = Facter.value('operatingsystem')
case operatingsystem
when "FreeBSD"

  present_zpools = `zpool list -H -o name`.chomp
  if ! present_zpools.empty?

    Facter.add(:zpools) do
      setcode do
        zpools = `for i in $(zpool list -H -o name); do echo $i; done`.chomp.split("\n")
      end
    end

    def addZpoolCapacityFact(zpool)
      zpool_capacity = `zpool get -H -o value capacity #{zpool}`.tr('%','').chomp

      Facter.add(zpool + "_capacity") do
        setcode do
          zpool_capacity
        end
      end

    end                                                                                                    

    zpools = Facter.value(:zpools)
    zpools.each do |zpool|
      addZpoolCapacityFact(zpool)
    end

  end

end

Теперь результат выглядит так, как я ожидал:

pool1_capacity: 10
pool2_capacity: 30
Другие вопросы по тегам