如何从Ansible URI调用检查json响应

时间:2016-10-25 08:54:10

标签: json sonarqube uri ansible ansible-playbook

我有一个服务调用,以json格式返回系统状态。我想使用ansible URI模块进行调用,然后检查响应以确定系统是启动还是关闭

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

这将是返回的json

这是发出呼叫的安全任务:

 - 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文档检查它,这是我们存储呼叫结果的方式。我不确定检查状态的最后一步。

3 个答案:

答案 0 :(得分:15)

这对我有用。

- 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是一个安全词典,当您设置return_content=yes时,响应会添加到此词典中,并且可以使用json键进行访问

还要确保您已正确缩进任务,如上所示。

答案 1 :(得分:2)

您已将输出保存为变量,从而迈出了正确的第一步。

下一步是在下一个任务中使用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有一些这方面的信息。 This blog post也非常有用。

答案 2 :(得分:1)

根据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