web-dev-qa-db-ja.com

Ansible URI呼び出しからのjson応答を検査する方法

システムステータスをjson形式で返すサービスコールがあります。 ansible [〜#〜] uri [〜#〜] モジュールを使用して呼び出しを行い、応答を検査してシステムが稼働しているか停止しているかを確認したい

{"id":"20161024140306","version":"5.6.1","status":"UP"}

これは、返されるjsonです

これは呼び出しを行うansibleタスクです:

 - name: check sonar web is up
   uri:
    url: http://sonarhost:9000/sonar/api/system/status
    method: GET
    return_content: yes
    status_code: 200
    body_format: json
    register: data

質問は、どのようにdataにアクセスして検査できるかということです。これは、可能なドキュメントに従って、呼び出しの結果を保存する方法です。ステータスを確認するための最終ステップがわかりません。

7
Hafiz

これは私にとってはうまくいきます。

- name: check sonar web is up
uri:
  url: http://sonarhost:9000/sonar/api/system/status
  method: GET
  return_content: yes
  status_code: 200
  body_format: json
register: result
until: result.json.status == "UP"
retries: 10
delay: 30

resultはansible辞書であり、return_content=yesを設定すると、応答がこの辞書に追加され、jsonキーを使用してアクセスできることに注意してください。

また、上記のようにタスクが適切にインデントされていることを確認してください。

21
Hafiz

出力を変数に保存することで、正しい最初のステップが完了しました。

次のステップは、どちらかを使用することですwhen:またはfailed_when:次のタスクのステートメント。変数の内容に基づいて切り替えられます。これらで使用するための完全な強力なステートメントのセット Jinja2組み込みフィルター がありますが、それらは実際にはAnsibleのドキュメントに適切にリンクされておらず、うまくまとめられていません。

私は超明示的に名前が付けられた出力変数を使用しているので、後でプレイブックで理解できます:)私はおそらくあなたのように書くでしょう:

- name: check sonar web is up
  uri:
    url: http://sonarhost:9000/sonar/api/system/status
    method: GET
    return_content: yes
    status_code: 200
    body_format: json
  register: sonar_web_api_status_output

- name: do this thing if it is NOT up
  Shell: echo "OMG it's not working!"
  when: sonar_web_api_status_output.stdout.find('UP') == -1

つまり、テキスト「UP」が変数のstdoutに見つかりません。

その他 Jinja2組み込みフィルター 私が使用したものは次のとおりです。

  • changed_when: "'<some text>' not in your_variable_name.stderr"
  • when: some_number_of_files_changed.stdout|int > 0

Ansible "Conditionals" docs page にはこの情報の一部があります。 このブログ投稿 も非常に有益でした。

6
ocean

https://docs.ansible.com/ansible/latest/modules/uri_module.html のドキュメントに従って

応答の本文をディクショナリ結果の「コンテンツ」キーとして返すかどうか。このオプションとは関係なく、報告されたContent-typeが「application/json」の場合、JSONは常に辞書結果のjsonというキーにロードされます。

---
- name: Example of JSON body parsing with uri module
  connection: local
  gather_facts: true
  hosts: localhost
  tasks:

    - name: Example of JSON body parsing with uri module
      uri: 
        url: https://jsonplaceholder.typicode.com/users
        method: GET
        return_content: yes
        status_code: 200
        body_format: json
      register: data
      # failed_when: <optional condition based on JSON returned content>

    - name: Print returned json dictionary
      debug:
        var: data.json

    - name: Print certain element
      debug:
        var: data.json[0].address.city
0
Boeboe