AnsibleでURIリクエストからのJSONレスポンスを確認する方法は?


15

JSONレスポンスを取得するためにWebサイトにURIリクエストを行うAnsibleタスクがあります。ネストされたJSON変数が定義されている場合はAnsibleに何かを行い、定義されていない場合は別のことを行います。

- name: Get JSON from the Interwebs
  uri: url="http://whatever.com/jsonresponse" return_content=yes
  register: json_response

- name: Write nested JSON variable to disk
  copy: content={{json_response.json.nested1.nested2}} dest="/tmp/foo.txt"

ignore_errorsは、Jinjaテンプレート内のネストされたデータ構造の未定義値をチェックするためではなく、タスクのコマンドが失敗した場合にのみ機能することに注意してください。したがって、json_response.json.nested1.nested2定義されていない場合、このタスクはignore_errors=yes設定されていても失敗します。

/tmp/foo.txtリクエストが失敗した場合、またはリクエストに適切なネストされた値が定義されていない場合に、このプレイブックを取得してデフォルト値を保存するにはどうすればよいですか?

回答:


20

jinja2フィルター(http://docs.ansible.com/ansible/playbooks_filters.html)を使用する必要があります。この場合、フィルターの名前はfrom_jsonです。次の例では、キーが見つかったときにアクションを実行し、キーが見つからなかったときに他のアクションを実行します。

 ---                                                                                                            

 - hosts: somehost                                                                                               
   sudo: yes                                                                                                    

   tasks:                                                                                                       

   - name: Get JSON from the Interwebs                                                                          
     uri: url="https://raw.githubusercontent.com/ljharb/node-json-file/master/package.json" return_content=yes  
     register: json_response                                                                                    

   - debug: msg="Error - undefined tag"                                                                         
     when: json_response["non_existent_tag"] is not defined                                                     

   - debug: msg="Success - tag defined =>{{  (json_response.content|from_json)['scripts']['test'] }}<="  
     when:  (json_response.content|from_json)['scripts']['test']  is defined    

目的のアクションを実行する適切なデバッグを置き換えます。

それが役に立てば幸い、


3

github apiからjsonからフィールドを抽出する方法を探した後、私はここでつまずきました。私は次の解決策になりました。

uri: url="https://api.github.com/repos/.../.../releases/latest" return_contents=yes

register: github_json

そして、このような他の場所でそれを使用します:

"{{ github_json.json.$key }}"

1
これが実際にOPに役立つかどうかはわかりません。$ keyがどこから来たのか実際には説明していません。基本的$keyに、応答にフィールドがない場合に何が起こるかを尋ねていdefaultます。
iwaseatenbyagrue

1
質問は1年半以上前のものであるため、これはOPへの直接の応答ではありませんでしたが、Ansibleのみを使用してAPIからJSON値を取得したい人にとって役立つことを願っていましたページ。
サミーコーネン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.