我正在编写一个小的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'}
答案 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