0

Puppet で、FreeBSD ストレージ サーバーの現在の zpool 容量の数値を取得し、それらをカスタム ファクトに格納し、容量が「高すぎる」レベルに達した場合にアラートを生成する方法を考え出そうとしています。これまでに見つけた問題に最も近いのは、次のとおりです。 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 を 2 回使用していたことです。変数を nil しようとしても、変数 'zpools' に適用された最初の分割関数も 'zpool_capacity' で実行されたため、結果は次のようになりました。 :

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

数字の間にある「\n」に注目してください。IO.popen を複数回使用できる Ruby の方法があると確信していますが、その方法がわからないので、単純なバッククォート (`) で実行するようにコマンドを変更しました。これが動作するコードです。

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 に答える