如何检查来自 Ansible URI 调用的 json 响应
How to inspect a json response from Ansible URI call
我有一个 returns 系统状态 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
并根据 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: result
until: result.json.status == "UP"
retries: 10
delay: 30
请注意,result
是一个 ansible 字典,当您设置 return_content=yes
时,响应将添加到该字典中,并且可以使用 json
键
访问
还要确保您已正确缩进任务,如上所示。
将输出保存到变量中,您迈出了正确的第一步。
下一步是在下一个任务中使用 when:
或 failed_when:
语句,然后根据变量的内容进行切换。 Jinja2 builtin filters 中有一整套强大的语句可供使用,但它们并没有很好地链接到 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"。
其他Jinja2 builtin filters我用过的有:
changed_when: "'<some text>' not in your_variable_name.stderr"
when: some_number_of_files_changed.stdout|int > 0
Ansible "Conditionals" docs page has some of this info. This blog post 也提供了很多信息。
根据 https://docs.ansible.com/ansible/latest/modules/uri_module.html
上的文档
是否 return 响应正文作为字典结果中的 "content" 键。独立于此选项,如果报告的内容类型为 "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
我有一个 returns 系统状态 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
并根据 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: result
until: result.json.status == "UP"
retries: 10
delay: 30
请注意,result
是一个 ansible 字典,当您设置 return_content=yes
时,响应将添加到该字典中,并且可以使用 json
键
还要确保您已正确缩进任务,如上所示。
将输出保存到变量中,您迈出了正确的第一步。
下一步是在下一个任务中使用 when:
或 failed_when:
语句,然后根据变量的内容进行切换。 Jinja2 builtin filters 中有一整套强大的语句可供使用,但它们并没有很好地链接到 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"。
其他Jinja2 builtin filters我用过的有:
changed_when: "'<some text>' not in your_variable_name.stderr"
when: some_number_of_files_changed.stdout|int > 0
Ansible "Conditionals" docs page has some of this info. This blog post 也提供了很多信息。
根据 https://docs.ansible.com/ansible/latest/modules/uri_module.html
上的文档是否 return 响应正文作为字典结果中的 "content" 键。独立于此选项,如果报告的内容类型为 "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