Кукольный: все пользовательские факты получают все результаты
Я пытаюсь найти в 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