通过Ansible将Json发布到API

时间:2015-05-28 14:10:41

标签: ansible ansible-playbook

我想通过Ansible向API端点发出POST请求,其中post数据中的一些项目是动态的,这是我尝试失败的原因:

我的body_content.json:

{
  apiKey: '{{ KEY_FROM_VARS }}',
  data1: 'foo',
  data2: 'bar'
}

这是我的Ansible任务:

# Create an item via API
- uri: url="http://www.myapi.com/create"
       method=POST return_content=yes HEADER_Content-Type="application/json"
       body="{{ lookup('file','create_body.json') | to_json }}"

可悲的是,这不起作用:

failed: [localhost] => {"failed": true}
msg: this module requires key=value arguments
....
FATAL: all hosts have already failed -- aborting

我的ansible版本是1.9.1

2 个答案:

答案 0 :(得分:12)

你不能在yaml中使用这样的换行符。试试这个(“>”表示要连接下一行):

# Create an item via API
- uri: >
    url="http://www.myapi.com/create"
    method=POST return_content=yes HEADER_Content-Type="application/json"
    body="{{ lookup('file','create_body.json') | to_json }}"

但我发现这更好:

# Create an item via API
- uri: 
    url: "http://www.myapi.com/create"
    method: POST
    return_content: yes
    HEADER_Content-Type: "application/json"
    body: "{{ lookup('file','create_body.json') | to_json }}"

答案 1 :(得分:4)

我发布的内容低于我最终用于我的用例(Ansible 2.0)。如果您的json有效内容是内联(而不是文件),则此选项很有用。

此任务期望 204作为其成功返回代码。

由于body_format是json,因此会自动推断标题

- name: add user to virtual host
  uri: 
    url: http://0.0.0.0:15672/api/permissions/{{ rabbit_virtualhost }}/{{ rabbit_username }}
    method: PUT
    user: "{{ rabbit_username }}"
    password: "{{ rabbit_password }}"
    return_content: yes
    body: {"configure":".*","write":".*","read":".*"}
    body_format: json
    status_code: 204

它基本上相当于:

curl -i -u user:pass -H "content-type:application/json" -XPUT http://0.0.0.0:15672/api/permissions/my_vhost/my_user -d '{"configure":".*","write":".*","read":".*"}'