在for循环中使用sys.exit

时间:2015-10-30 17:33:38

标签: python for-loop dictionary exit

我正在编写一个小的python脚本,它遍历一个大的json输出并获取我需要的信息并将其放入小字典中。然后,它遍历字典以查找名为restartcount的密钥。如果计数超过3但小于5,则打印warning。如果大于5,则打印critical。但是,此脚本设置为nagios插件,要求退出代码放置警告sys.exit(1)sys.exit(2)放置为关键。如果你查看我的脚本,我使用我的函数将我需要的信息抓取到一个小字典中,然后运行for循环。如果我在任何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'}

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

变量方法是正确的 问题是,当你进一步检查时,你可能已经将它设置为1,因此我建议在这里添加一个条件,如果它已经是2,则不要将它设置为1