无法在Ansible中呈现JSON并通过uri模块发布

时间:2015-11-25 20:11:51

标签: json ansible ansible-playbook

我试图使用Ansible 1.9.4发布JSON正文,但没有任何作用。

这是我作为任务之一:

- name: Post
  uri:
    url: https://hooks.slack.com/endpoint
    method: POST
    return_content: no
    HEADER_Content-Type: "application/json"
    body: "{{ lookup('template', '../templates/my.json.j2', convert_data=False) }}"

这始终会导致TypeError: unhashable type错误。我在JSON文件中尝试过以下操作,但都不起作用:

{"channel": "chatops","username": "Deploy","text": "TEST Deploy!","icon_emoji": ":ghost:"}

{
  "channel": "chatops",
  "username": "Deploy",
  "text": "TEST Deploy!",
  "icon_emoji": ":ghost:"
}

但是,将以下内容放入游戏中:

body: '{"channel": "chatops-test","username": "Deploy","text": "TEST Deploy!","icon_emoji": ":ghost:"}'

管道lookupto_json也不起作用。将var设置为以下内容并执行body: "{{ the_body }}"也不起作用:

the_body:
  channel: "chatops-test"
  username: "Deploy"
  text: "TEST!!!"

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我想你可能会遇到一个bug。我只是花了一些时间来完成一些测试,并继续遇到意想不到的问题,也使用ansible 1.9.4。这里简要概述了我目前处理您的问题的地方:

   - name: set fact
      set_fact: foo="{{ lookup('template', 'oneline.txt', convert_data=False) }}"

    - debug: var=foo

    - name: echo foo
      shell: echo '{{ foo }}' > /tmp/foo.out

文件' oneline.txt'有你的json字符串:

{"channel": "chatops","username": "Deploy","text": "TEST Deploy!","icon_emoji": ":ghost:"}

这表明Ansible正在以奇怪的方式截断字符串:

PLAY [test] *******************************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [set fact] **************************************************************
ok: [localhost]

TASK: [debug var=foo] *********************************************************
ok: [localhost] => {
    "var": {
        "foo": "\"{\"channel\": \"chatops\",\"username\": \"Deploy\",\"text\": \"TEST"
    }
}

TASK: [echo foo] **************************************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0

文件' /tmp/foo.out'也显示截断值:

$ cat /tmp/foo.out
"{"channel": "chatops","username": "Deploy","text": "TEST

除此之外,如果从set_fact调用中删除绑定引号,则字符串会被截断更多。

我建议您向Ansible project forum发布有关此问题和/或向Ansible on github提交错误报告。 Ansible开发人员会定期监控这两个问题,以便他们可以确认发生了什么,并希望如果他们认为这是一个错误,就可以解决这个问题。