2014-10-06 79 views
0

我试图在Puppet中找到一种方法来获取我的FreeBSD存储服务器的当前zpool容量数量,将它们存储在自定义事实中,并在容量达到“太高水平。最近的比赛我的问题从来就发现迄今: Returning multiple custom facts with 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 

但doesn't相当产生的结果,我期待,例如:

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