提升Salt Api稳定性

##使用local_async而不是local。 这样做的好处是执行长流程的任务不会出现超时问题。

非常简单的例子:

import time
import requests

# 获取TOKEN的步骤省略

headers = {
	"Accept":"application/json",
 	'X-Auth-Token':TOKEN,
}
data = {
	'client':'local_async',
	'expr_form': 'glob',
	'tgt': 'minion1',
	'fun': 'func.run_long_time',
}
res=requests.post(BASE_URL, data, headers=headers, verify=False, timeout=REQUEST_TIMEOUT)
# 获取job id
jid=res.json()['return'][0]['jid']  

#轮询结果
while True:
	job_url='{0}/jobs/{1}'.format(BASE_URL,jid)
	res=requests.get(job_url, headers=headers, verify=False, timeout=REQUEST_TIMEOUT)
	# TODO: 判断是否执行完成
	time.sleep(5)

##检查job有没有在minion上执行

通过saltutil.find_job可以确定job有没有正在minion上运行,如果job没有运行,则尝试获取返回结果。

def _is_job_running(self, tgt, expr_form, jid):
    """判断job有没有正在minion上运行"""
    res = sync_execute(tgt, "saltutil.find_job", arg=[jid], expr_form=expr_form)
    try:
        # {"return": [{"127.0.0.1": {"tgt_type": "glob", "jid": "20160402143702150218",
        #  "tgt": "127.0.0.1", "pid": 9354, "ret": "", "user": "saltapi",
        #  "arg": ["sleep 5;echo 123;"],
        #  "fun": "cmd.run"}}]
        # }
        # 有返回值说明job正在运行.
        if res.json()["return"][0].values()[0]:
            return True
        else:
            return False
    except:
        return False

##获取job的结果

这时会有两种情况:1. job的执行结果可以被正常获取到 2.找不到job的执行结果,出现这种情况说明job执行到一半被打断了,有可能是minion被关闭了,需要抛出异常。

headers = {"Accept": "application/json",
           'X-Auth-Token': token,
           }
job_url = '{0}/jobs/{1}'.format(self.api_endpoint, jid)
res = self.request("get", job_url, headers=headers)
LOG.debug(res.text)
try:
    result = res.json()['info'][0]['Result']
except:
    raise SaltApiException(res.text)

if not result:
    raise SaltApiException("cloud not fetch job result, job is broken on minion.")

转载于:https://my.oschina.net/fmnisme/blog/617747

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值