0

我试图在 Puppet 中找到一种方法来获取我的 FreeBSD 存储服务器的当前 zpool 容量数字,将它们存储在自定义事实中,并在容量达到“太高”水平时生成警报。到目前为止,我发现的与我的问题最接近的匹配是: Returning multiple custom fact 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

但并没有完全产生我期望的结果,例如:

capacity_pool1: 10 30
capacity_pool2: 10 30

当我真的期待时:

capacity_pool1: 10
capacity_pool2: 30

我究竟做错了什么?

4

1 回答 1

1

好的,解决了!

问题是在同一个脚本中使用 IO.popen 两次,即使我尝试对变量进行 nil 处理,我认为应用于变量“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
于 2014-10-07T08:05:59.557 回答