2015-10-30 3 views
0

Я пишу небольшой скрипт python, который выполняет итерацию через большой вывод json и захватывает необходимую мне информацию и помещает ее в маленькие словари. Затем он итерации через словари ищут ключ под названием restartcount. Если счетчик больше 3, но меньше 5, он печатает warning. Если оно больше 5, оно печатает critical. Однако этот скрипт настроен как плагин nagios, который требует, чтобы коды выхода были помещены с предупреждением sys.exit(1) и sys.exit(2) для критического. Если вы посмотрите на мой сценарий, я использую свою функцию, чтобы захватить нужную мне информацию в небольшой словарь, а затем запустить цикл for. Если я помещаю sys.exit после того, как внутри любого оператора if я повторяю только первый словарь, а остальные не проверяются. Любая помощь будет оценена в отношении того, как включать коды выхода, не теряя пропуска или пропуская какую-либо информацию.Использование sys.exit для циклов

Код:

import urllib2 
import json 
import argparse 
from sys import exit 

def get_content(pod): 
    kube = {} 
    kube['name'] = pod["metadata"]["name"] 
    kube['phase'] = pod["status"]["phase"] 
    kube['restartcount'] = pod["status"]["containerStatuses"][0]["restartCount"] 
    return kube 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='Monitor Kubernetes Pods') 
    parser.add_argument('-w', '--warning', type=int, help='levels we should look into',default=3) 
    parser.add_argument('-c', '--critical', type=int, help='its gonna explode',default=5) 
    parser.add_argument('-p', '--port', type=int, help='port to access api server',default=8080) 
    args = parser.parse_args() 

try: 
    api_call = "http://localhost:{}/api/v1/namespaces/default/pods/".format(args.port) 
    req = urllib2.urlopen(api_call).read() 
    content = json.loads(req) 
except urllib2.URLError: 
    print 'URL Error. Please re-check the API call' 
    exit(2) 


for pods in content.get("items"): 
    try: 
     block = get_content(pods) 
     print block 
    except KeyError: 
     print 'Container Failed' 
     exit(2) 

    if block["restartcount"] >= args.warning and block["restartcount"] < args.critical: 
     print "WARNING | {} restart count is {}".format(block["name"], block["restartcount"]) 

    if block["restartcount"] >= args.critical: 
     print "CRITICAL | {} restart count is {}".format(block["name"], block["restartcount"]) 

, что переменная block выглядит следующим образом:

{'phase': u'Running', 'restartcount': 0, 'name': u'pixels-1.0.9-k1v5u'} 
+1

sys.ext завершает работу приложения. если вы пытаетесь оставить цикл, используйте 'break', если вы пытаетесь продолжить цикл, используйте' continue' ... если вы хотите выйти после завершения цикла, установите флаг внутри цикла, используйте 'continue' и проверьте флаг за пределами петли – Busturdust

+0

@Busturdust - Я знаю это очень хорошо. Однако мне нужно использовать sys.exit, чтобы сообщить о статусе процесса nagios – letsc

+1

выход только после цикла, установив какое-то условие флага внутри и проверив его после завершения, если это правда? – Busturdust

ответ

3

Создайте переменную под названием что-то вроде exit_status. Инициализируйте его до 0 и установите его по мере необходимости в коде (например, когда вы в настоящее время звоните exit). В конце выполнения программы вызовите sys.exit(exit_status) (и не где еще).

Переписывая последний раздел кода:

exit_status = 0 
for pods in content.get("items"): 
    try: 
     block = get_content(pods) 
     print block 
    except KeyError: 
     print 'Container Failed' 
     exit(2) 

    if block["restartcount"] >= args.warning and block["restartcount"] < args.critical: 
     print "WARNING | {} restart count is {}".format(block["name"], block["restartcount"]) 
     if exit_status < 1: exit_status = 1 

    if block["restartcount"] >= args.critical: 
     print "CRITICAL | {} restart count is {}".format(block["name"], block["restartcount"]) 
     exit_status = 2 

sys.exit(exit_status) 
+0

Как уже говорилось выше, Ive уже пробовал этот шаг, он дает мне флаг предупреждения, но оператор печати «потерян» – letsc

+0

Является ли код выше текущего кода, который вы используете? Можете ли вы показать пример «потерянного» заявления о печати? – davejagoda

+0

да. Удалил sys.exit в циклах for (как вы предположили), поскольку это не то, на что я нацелен – letsc

0

переменной подход является правильным Проблема заключается в том, что, как вы проверяете дальше, вы, вероятно, установить его в 1, когда он был уже 2, так что я хотел бы предложить добавить здесь условие не устанавливать его в 1, если оно уже 2

Смежные вопросы