Python TypeError:Unshable类型,尽管在uri:task中使用了body格式:json

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:

如果我向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: 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)]