首页 > 解决方案 > Ansible 中的循环任务

问题描述

我在 Ansible 中有以下任务:

- name: Getting Job Info
  uri:
     url: "https://{{ hostname }}/job/JobService"
     method: POST
     user: "{{ username }}"
     password: "{{ password }}"
     body: "{{ lookup( 'template' , 'jobInfo.xml.j2' )  }}"
     status_code: 200
     validate_certs: false
     headers:
       soapaction: "getJobInfoVO"
     return_content: true
  register: job_status_soap

- name: Converting Job Info response to JSON
  set_fact:
    job_status_json: "{{ job_status_soap.content | xml2json }}"

- name: Setting Job Status
  set_fact:
    job_status: "{{ job_status_json['soapenv:Envelope']['soapenv:Body']['multiRef'][0]['status']['#text'] }}"

- debug: msg="{{ job_status }}"

如您所见,它进行 Web 服务调用,将 SOAP 响应转换为 JSON,然后提取相关值(整数)并将其设置为事实。我需要重复这段代码,直到前面提到的整数值等于某个整数。

关于我如何处理这项任务的任何想法?

标签: loopsansibleuri

解决方案


如果响应是 JSON 格式,这将很容易使用until执行 ansible do-until 循环来实现。但这是一个带有 xml 响应的工作示例。

先决条件:(确保您的 ansible 主机上安装了 python 依赖项)

1) 使用自定义xml_to_json过滤器。

2) 使用json_query过滤器

PS 执行后续播放不会触发重试,因为until已满足条件。如果要测试重试是否有效,请更改until请求标头中的条件或标记值。

---
- name: Retry url until xml content equals certain value
  hosts: 127.0.0.1
  connection: local
  become_user: root
  become: yes
  tasks:
    - name: Check job status
      uri:
          url: "https://httpbin.org/anything"
          method: GET
          timeout: 10
          validate_certs: no
          headers:
            content: "<envelope><body><request><status>2</status></request></body></envelope>"
      register: get_search_job_status_response
      until: get_search_job_status_response.json.headers.Content|from_xml|json_query('envelope.body.request.status')|int == 2
      retries: 2
      delay: 2
...

推荐阅读