web-dev-qa-db-ja.com

Ansibleを介してJsonをAPIに投稿する

POSTリクエストをAPIエンドポイントにAnsible経由でリクエストします。ここで、投稿データ内の一部のアイテムは動的です。ここで私が試して失敗します:

私の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です

8
Mudaer

このような改行は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 }}"
12

ユースケース(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":".*"}'
5
FuzzyAmi