Python TypeError:Unshable类型,尽管在uri:task中使用了body格式:json
如果我向uri:task添加一个主体,任务将失败,状态代码为-1而不是[200]:出现未知错误:不可损坏类型 如果我删除主体:那么Web服务返回一个错误(因为它需要主体!),但至少它可以到达Web服务 这就是任务:Python TypeError:Unshable类型,尽管在uri:task中使用了body格式:json,python,ansible,ansible-awx,Python,Ansible,Ansible Awx,如果我向uri:task添加一个主体,任务将失败,状态代码为-1而不是[200]:出现未知错误:不可损坏类型 如果我删除主体:那么Web服务返回一个错误(因为它需要主体!),但至少它可以到达Web服务 这就是任务: - name: create new RE if RE doesn't exist uri: url: https://api.eu.cloud.talend.com/tmc/v1.3/runtimes/remote-engines method:
- name: create new RE if RE doesn't exist
uri:
url: https://api.eu.cloud.talend.com/tmc/v1.3/runtimes/remote-engines
method: POST
headers:
Authorization: Basic {{talend_personal_access_token}}
Accept: application/json
status-code: 201
body-format: json
body:
name: "{{RE_name}}"
register: new_RE_response
when: check_response.json[0].id is undefined
这是输出:
{
"status": -1,
"exception": "Traceback (most recent call last):\n File \"/tmp/ansible_uri_payload_nEptqB/ansible_uri_payload.zip/ansible/module_utils/urls.py\", line 1359, in fetch_url\n unix_socket=unix_socket)\n File \"/tmp/ansible_uri_payload_nEptqB/ansible_uri_payload.zip/ansible/module_utils/urls.py\", line 1257, in open_url\n use_gssapi=use_gssapi, unix_socket=unix_socket)\n File \"/tmp/ansible_uri_payload_nEptqB/ansible_uri_payload.zip/ansible/module_utils/urls.py\", line 1163, in open\n r = urllib_request.urlopen(*urlopen_args)\n File \"/usr/lib64/python2.7/urllib2.py\", line 154, in urlopen\n return opener.open(url, data, timeout)\n File \"/usr/lib64/python2.7/urllib2.py\", line 431, in open\n response = self._open(req, data)\n File \"/usr/lib64/python2.7/urllib2.py\", line 449, in _open\n '_open', req)\n File \"/usr/lib64/python2.7/urllib2.py\", line 409, in _call_chain\n result = func(*args)\n File \"/tmp/ansible_uri_payload_nEptqB/ansible_uri_payload.zip/ansible/module_utils/urls.py\", line 356, in https_open\n return self.do_open(CustomHTTPSConnection, req)\n File \"/usr/lib64/python2.7/urllib2.py\", line 1211, in do_open\n h.request(req.get_method(), req.get_selector(), req.data, headers)\n File \"/usr/lib64/python2.7/httplib.py\", line 1056, in request\n self._send_request(method, url, body, headers)\n File \"/usr/lib64/python2.7/httplib.py\", line 1090, in _send_request\n self.endheaders(body)\n File \"/usr/lib64/python2.7/httplib.py\", line 1052, in endheaders\n self._send_output(message_body)\n File \"/usr/lib64/python2.7/httplib.py\", line 894, in _send_output\n self.send(message_body)\n File \"/usr/lib64/python2.7/httplib.py\", line 866, in send\n self.sock.sendall(data)\n File \"/usr/lib64/python2.7/ssl.py\", line 744, in sendall\n v = self.send(data[count:])\nTypeError: unhashable type\n",
"url": "https://api.eu.cloud.talend.com/tmc/v1.3/runtimes/remote-engines",
"changed": false,
"elapsed": 1,
"content": "",
"invocation": {
"module_args": {
"directory_mode": null,
"force": false,
"remote_src": null,
"status_code": [
200
],
"follow": false,
"owner": null,
"body_format": "raw",
"body-format": "json",
"client_key": null,
"group": null,
"use_proxy": true,
"headers": {
"Accept": "application/json",
"Authorization": "Basic <censored>"
},
"unsafe_writes": null,
"setype": null,
"content": null,
"serole": null,
"follow_redirects": "safe",
"return_content": false,
"client_cert": null,
"body": {
"name": "RHEL_X.X.X.X_AZGLGBNEVTA30_PRODUCTION_C4E"
},
"timeout": 30,
"src": null,
"dest": null,
"selevel": null,
"force_basic_auth": true,
"removes": null,
"http_agent": "ansible-httpget",
"regexp": null,
"status-code": 201,
"url_password": null,
"url": "https://api.eu.cloud.talend.com/tmc/v1.3/runtimes/remote-engines",
"validate_certs": true,
"seuser": null,
"method": "POST",
"creates": null,
"unix_socket": null,
"delimiter": null,
"mode": null,
"url_username": null,
"attributes": null,
"backup": null
}
},
"redirected": false,
"msg": "Status code was -1 and not [200]: An unknown error occurred: unhashable type",
"_ansible_no_log": false
}
这是通过AWX 9.1.1运行的
这是一个bug还是我做错了什么?首先,您使用的是状态代码201,并期望状态代码为200。如果您希望收到200个成功响应,请删除状态代码。
其次,如果发送POST请求,请使用
return\u content:true
更多信息。检查您的语法是否不正确。正确的变量是
status\u code
,而不是status code
(下划线而不是破折号):不,我希望201会成功(根据web服务的文档),我不知道为什么错误消息会报告它正在查找200,可能是硬编码到错误消息中。从链接:
如果报告的内容类型是“application/json”,然后JSON总是加载到字典结果中名为JSON的键中。
和当[body_format]设置为JSON或form urlencoded时,如果需要,对body参数进行编码,并**相应地自动设置内容类型标题。**
如下所述,您需要将“状态代码:201”更改为“状态代码:201”。如果该参数拼写错误,将使用默认值,“200”是您在下面提到的默认值。当你解决这个问题的时候,剧本现在能像预期的那样工作吗?我最终从头开始重新输入整个任务,让它工作,并且(检查它现在是什么)你100%正确。
ansible --version
ansible 2.9.4
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/home/jason_ho/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Jun 11 2019, 14:33:56) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]