У меня есть скрипт Python, который принимает переменное количество целых чисел и работает с ними. Значения передаются сценарию с аргументом командной строки -s
. Когда я запускаю скрипт локально, он работает нормально:
python check_myScript.py -s 1 2 3 4
Внутри целые числа превращаются в массив, разделенный запятыми, с помощью этого кода:
# /usr/lib/naios/plugins/check_myScript.py
import argparse
parser = argparse.ArgumentParser
parser.add_argument('-s', '--myNumbers', nargs='*', default="")
args = parser.parse_args()
Если я затем вызову print args.myNumbers
в сценарии, я получу массив, который выглядит так:
['1', '2', '3', '4']
Мне не удалось получить такой же вывод на Icinga Web. Я подозреваю, что это как-то связано с тем, как Icinga разрешает макросы. Мой код выглядит следующим образом:
# /etc/icinga2/conf.d/myScript.conf
# . . .
object Service "myService" {
import "generic-service"
host_name = "myHost"
check_command = "myCheckCommand"
vars.someNumbers = "1,2,3,4"
}
#/etc/icinga2/conf.d/commands.conf
# . . .
object CheckCommand "myCheckCommand" {
command = [PluginDir + "/check_myScript.py",]
arguments = {"-s" = "$someNumbers$"}
}
Вот некоторые входные данные, которые я пробовал для vars.someNumbers =
, и соответствующие им выходные данные:
INPUT | OUTPUT
----------------------------------------------
"'1' '2' '3' '4'" → ["'1' '2' '3' '4'"]
"['1' '2' '3' '4']" → ["['1' '2' '3' '4']"]
"['1','2','3','4']" → ["['1', '2', '3', '4']"]
['1','2','3','4'] → error
[1,2,3,4] → ['4']
[1 2 3 4] → error
"1,2,3,4" → ['1, 2, 3, 4']
Обновление: после долгих возни мне удалось заставить массивы выглядеть одинаково. Сначала мне пришлось изменить часть arguments
моей команды проверки, чтобы отключить повторяющиеся клавиши:
arguments = {
"-s" = {
value = "$someNumbers$"
repeat_key = false
}
}
И мне пришлось использовать ввод ["1", "2", "3", "4"]
. (Интересно, что ['1', '2', '3', '4']
не работает, так что, очевидно, есть разница между одинарными и двойными кавычками.)
Однако возникла новая проблема: мой метод .join()
ведет себя на Icinga иначе, чем на моей локальной машине. На моей локальной машине после .join()
я получаю:
1,2,3,4
тогда как на Icinga я получаю:
1, 2, 3, 4
(обратите внимание на пробелы)
Я попытался добавить .replace(" ","")
к моей команде .join()
, но это не дало результата.
Обновление 2: у Исинги какая-то странная одержимость запятыми и пробелами. Этот тест иллюстрирует проблему:
# test.py
sentence = ['this','is','a','sentence']
print sentence # → ['this', 'is', 'a', 'sentence']
print '-'.join(sentence) # → this-is-a-sentence
print ','.join(sentence) # → this, is, a, sentence
Вот еще более простой пример проблемы:
print "I,don't,want,spaces!" # → I, don't, want, spaces!
Как я ни старался, я еще не смог удалить пробелы (что является проблемой для моего приложения, поскольку предполагается, что оно динамически создает URL-адрес с переданными параметрами).
Обновление 3: Мой текущий обходной путь для моей конкретной ситуации — использовать %2C
в моем методе .join()
, который является кодировкой URL для запятой.