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
にアクセスして検査できるかということです。これは、可能なドキュメントに従って、呼び出しの結果を保存する方法です。ステータスを確認するための最終ステップがわかりません。
これは私にとってはうまくいきます。
- 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
キーを使用してアクセスできることに注意してください。
また、上記のようにタスクが適切にインデントされていることを確認してください。
出力を変数に保存することで、正しい最初のステップが完了しました。
次のステップは、どちらかを使用することです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 にはこの情報の一部があります。 このブログ投稿 も非常に有益でした。
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