Циклы заданий в Ansible - PullRequest
       17

Циклы заданий в Ansible

0 голосов
/ 14 ноября 2018

У меня есть следующие задачи в 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 }}"

Как видите, он выполняет вызов веб-службы, преобразует ответ SOAP в JSON, а затем извлекает соответствующее значение (целое число) и устанавливаетэто как факт.Мне нужно повторять этот блок кода, пока вышеупомянутое целочисленное значение не станет равным определенному целому числу.

Есть идеи о том, как я могу подойти к этой задаче?

1 Ответ

0 голосов
/ 21 ноября 2018

Это было бы легко реализовать с использованием until для выполнения цикла ansible do-till , если ответ был в формате JSON. Но вот рабочий пример с xml response.

Предварительные условия: (Убедитесь, что у вас на компьютере ANSI установлены зависимости python)

1) Использование пользовательского фильтра xml_to_json .

2) Использование json_query filter

P.S. Выполнение следующего воспроизведения не приведет к повторной попытке, поскольку условие 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
...
...