Как избежать запятых в аргументе массива Icinga

У меня есть скрипт 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 для запятой.


person Taylor Liss    schedule 16.05.2018    source источник


Ответы (1)


Думаю, лучше всего использовать массив в Айсинга 2

object Service "myService" {
  import "generic-service"
  host_name = "myHost"
  check_command = "myCheckCommand"
  vars.someNumbers = [1, 2, 3, 4]
}

Затем с repeat_key false должно работать.

arguments = {
    "-s" = { 
        value = "$someNumbers$"
        repeat_key = false
    }
}

Имейте в виду, что Icinga 2 не позволит вам вставлять «пробелы» в отдельные части командной строки. Это функция безопасности, поэтому вы не можете добавлять шелл-код.

Icinga 2 создает список аргументов для выполнения, так что пробелы включаются в один аргумент.

Вы также можете выполнить разделение в Icinga 2, но это расширенное использование:

vars.someNumbers = "1,2,3,4"

object CheckCommand "myCheckCommand" {
  command = [PluginDir + "/check_myScript.py",]
  arguments = {
    "-s" = { 
      value = {{ 
        return macro("$someNumbers$").split(",")
      }}
      repeat_key = false
  }
}
person lazyfrosch    schedule 25.05.2018