使用Python调用VMware Aria Automation Config API时.format方法失效求助
问题:调用VMware Aria Automation Config API时使用.format传递参数失败
我在用Python调用VMware Aria Automation Config API实现任务自动化时,发现没法用.format方法给API方法传参,直接传参能正常运行,但用字符串格式化后就报错。
无法正常运行的代码
from sseapiclient import APIClient client = APIClient('http://myaac.com', username, password) mycommand = 'cmd="local",fun="test.ping",tgt={"saltmaster":{"tgt":"minion*","tgt_type":"glob"}}' client.api.cmd.route_cmd('{}'.format(mycommand))
报错信息
"3004: Request validation failure. job_uuid: - Not a valid UUID. cmd: - Expected 'cmd'"
能正常运行的代码
from sseapiclient import APIClient client = APIClient('http://myaac.com', username, password) client.api.cmd.route_cmd(cmd="local",fun="test.ping",tgt={"saltmaster":{"tgt":"minion*","tgt_type":"glob"}})
解决思路
问题根源
你用.format把参数拼成了单个字符串,但route_cmd方法需要的是关键字参数(kwargs),不是单个字符串参数。直接传cmd="local", fun="test.ping"...是给方法传递了多个独立的关键字参数,而用字符串格式化后只传了一个字符串,方法会把这个字符串当成第一个位置参数job_uuid(所以报UUID无效),同时根本没收到cmd等必要参数,自然报错。
正确解决方法
方法1:用字典存储参数+解包传递(推荐)
把参数存在字典里,需要动态修改时直接调整字典的键值,然后用**运算符把字典解包成关键字参数传给方法,既灵活又符合API要求:
from sseapiclient import APIClient client = APIClient('http://myaac.com', username, password) # 用字典存储参数,方便动态修改 cmd_params = { "cmd": "local", "fun": "test.ping", "tgt": {"saltmaster": {"tgt": "minion*", "tgt_type": "glob"}} } # 解包字典作为关键字参数传递 client.api.cmd.route_cmd(**cmd_params)
比如你要修改目标主机规则,直接改cmd_params["tgt"]["saltmaster"]["tgt"]即可,非常方便。
方法2:字符串转字典(不推荐)
如果非要用字符串拼接的方式,需要把字符串解析成字典再解包,但这种方法容易出错,还存在安全风险(比如参数含恶意代码),仅作参考:
from sseapiclient import APIClient import json client = APIClient('http://myaac.com', username, password) mycommand_str = 'cmd="local",fun="test.ping",tgt={"saltmaster":{"tgt":"minion*","tgt_type":"glob"}}' # 分割字符串成键值对,转成字典 cmd_params = {} for item in mycommand_str.split(','): key, value = item.split('=', 1) # 处理字符串引号 value = value.strip('"') # 解析tgt的字典结构 if key == 'tgt': value = json.loads(value) cmd_params[key] = value client.api.cmd.route_cmd(**cmd_params)
内容的提问来源于stack exchange,提问作者Norskyi
相关产品推荐
相关产品推荐

