2014-10-06 4 views
0

Я пытаюсь найти способ в кукольном, чтобы получить текущие номера емкости zpool для моих серверов хранения FreeBSD, хранить их в пользовательских фактах и ​​генерировать предупреждение, если емкость достигает "слишком высокий уровень. Ближайший матч к моей проблеме, что I've нашел до сих пор является: Returning multiple custom facts with puppet FacterPuppet: все пользовательские факты получают все результаты

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

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

OK, решена!

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

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

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

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 
Смежные вопросы