Я пишу небольшой скрипт 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'}
sys.ext завершает работу приложения. если вы пытаетесь оставить цикл, используйте 'break', если вы пытаетесь продолжить цикл, используйте' continue' ... если вы хотите выйти после завершения цикла, установите флаг внутри цикла, используйте 'continue' и проверьте флаг за пределами петли – Busturdust
@Busturdust - Я знаю это очень хорошо. Однако мне нужно использовать sys.exit, чтобы сообщить о статусе процесса nagios – letsc
выход только после цикла, установив какое-то условие флага внутри и проверив его после завершения, если это правда? – Busturdust