Ansible循环,直到条件匹配为止。

时间:2018-11-14 00:20:32

标签: ansible

我想进行一系列的API调用,在每次调用后检查结果中的特定参数,如果该参数大于特定值,则将其保存在寄存器中并继续执行剧本。

基本上,我正在对RHEV进行API调用以检查存储域。然后,我要检查存储域是否有足够的空间,如果可以,请将该存储域ID存储在寄存器中以在存储域上创建磁盘。

以下是我如何通过单个API调用storagedomain的代码段。

 - name: Get Free Storage Domain On RHEV
  uri:
    url: "{{ rhevurl }}/storagedomains/7649aea2-d87c-4066-acca-4399d5261ade"
    method: GET
    user: "{{ rhevusername }}"
    password: "{{ rhevpassword }}"
    return_content: yes
    headers:
      Version: 4
      Accept: "application/xml"
      Content-type: "application/xml"
  register: storagedomain
  tags: storagedomain


- name: Retriving size.
  xml:
    xmlstring: "{{ storagedomain.content }}"
    xpath: /storage_domain/available
    content: text
  register: availablesize
  tags: storagedomain


- name: storage_domain size
  debug:
    var: availablesize.matches[0].available
  tags: storagedomain

现在,我想对多个存储域执行此过程,并且当循环获得具有可用空间的storagedomain时,循环应该会中断。

类似下面的内容。

- name: Get Free Storage Domain On RHEV
  uri:
    url: "{{ rhevurl }}/storagedomains/{{ item }}"
    method: GET
    user: "{{ rhevusername }}"
    password: "{{ rhevpassword }}"
    return_content: yes
    headers:
      Version: 4
      Accept: "application/xml"
      Content-type: "application/xml"
  loop:
    - 7649aea2-d87c-4066-acca-4399d5261ade
    - 40cceee7-a8d3-45af-a2d0-70c414be32cc
    - a81411b0-4ddb-4467-a4c6-ac9364905248
    - b288c547-231c-44b9-8329-98adcbdfc726 
    - 8cdef991-3edc-4c35-9228-feeef8f29004
    - 837a2e1b-6365-4309-a526-0cd05801fe43
    - 8981bf82-a1da-405e-a7f5-d84f2c94d71d
    - 7a9e3904-e37b-48fd-b850-0f026dc5cde9

在循环中,我应该如何使用xml模块解析xml,然后检查大于特定大小的可用空间的条件

2 个答案:

答案 0 :(得分:1)

您不能中断循环,但是如果您的条件满足任何条件,则可以跳过循环执行。请查看以下示例。

test.yml 该剧本将执行shell模块,并带有忽略错误并设置var1变量。但是block模块仅在未定义var1之前执行。

- block:
  - shell: expr {{item}} + 1
    ignore_errors: yes
    register: cmd_stat

  - set_fact: var1={{item}}
    when: cmd_stat.rc == 0
  when: var1 is not defined

sites.yml (根据您的循环项,此播放多次包含test.yml剧本)。

---
- hosts: localhost
  connection: local
  vars:
  tasks:
    - include: test.yml
      loop: ["abc","def", "ghi",1, "jkl"]

    - name: increase var1 variable by 1 and write to text file
      shell: expr {{var1}} + 1 > text

因此,使用与您可以在剧本中实现的逻辑相同的逻辑。例如url的状态为200,然后设置storage变量并将其与when条件一起使用。

我希望您能够理解该示例。

答案 1 :(得分:0)

until:retries:(可能还有delay:)或async:(具有its own section in the fine manual)与poll:可能会满足您的要求< / p>