开发SaltStack的Web界面,遇到一个神奇的问题:
通过python调用salt-api没有返回值,直到超时,并且后端打印DEBUG日志:
会提示机器链接不上,而且机器hostname是被拆分开的。
但是如果使用curl命令是可以得到返回值的。
curl -k https://xx.xxx.com:9000 -H 'Accept: application/x-yaml' -H 'X-Auth-Token: xxxxx' -d client='local' -d tgt='*' -d expr_from='list' -d fun='test.ping'Python代码:
import json import urllib import urllib2 import ssl ssl._create_default_https_context = ssl._create_unverified_context salt_url = 'https://xxx.xxx.xxx.com:9000' salt_json_data = {'client':'local', 'tgt':'*', 'expr_form':'list', 'fun':'test.ping'} salt_json = json.dumps(salt_json_data) header = {'Content-Type':'application/json', 'Accept':'application/x-yaml', 'X-Auth-Token':'xxxx'} req = urllib2.Request(salt_url, salt_json, header) res = urllib2.urlopen(req) result = res.read()后来。仔细排查日志,发现了问题。
有问题的部分的代码:
if 'topic_lst' in package: topic_lst = package['topic_lst'] for topic in topic_lst: if topic in self.present: for client in self.present[topic]: try: f = client.stream.write(payload) self.io_loop.add_future(f, lambda f: True) except tornado.iostream.StreamClosedError: to_remove.append(client) else: log.debug('Publish target {0} not connected'.format(topic))最后发现tcp transport默认是解析数组。
也就是说topic_lst,即机器列表,应该是以数组形式传递的。
修正后,问题得到解决。