Ansible如何循环执行一系列任务?

Der*_*har 5 ansible ansible-playbook

Ansible剧本如何在一系列任务上循环播放?我希望实现一个轮询循环,该循环执行任务序列,直到任务成功为止。当失败时,异常处理程序将尝试修复条件,然后循环将重复任务序列。

考虑以下虚构示例:

- action:
    - block:
        - debug: msg='i execute normally'
        - command: /bin/foo
      rescue:
        - debug: msg='I caught an error'
        - command: /bin/fixfoo
      always:
        - debug: msg="this always executes"
  register: result
  until: result
  retries: 5
  delay: 10
Run Code Online (Sandbox Code Playgroud)

pio*_*ojo 5

从 Ansible 2.5 开始,loop建议超过with_items. 此外,由于您不想假设您的子任务不会有任何循环,因此您可以使用比“item”更具描述性的名称。这是一个在循环中使用循环的示例,稍微被截断但如果您定义适当的配置仍然可以工作:

# terminate-instances-main.yml:
---
- hosts: local
  connection: local
  vars:
    regions:
      - ap-southeast-1
      - us-west-1
  tasks:
    - include_tasks: "terminate-instance-tasks.yml"
      loop: "{{ regions }}"
      loop_control:
        loop_var: region

# terminate-instance-tasks.yml:
---
- name: Gather EC2 facts
  ec2_instance_facts:
    region: "{{ region }}"
    filters:
      "tag:temporary": "true"
    aws_access_key: "{{ aws_access_key }}"
    aws_secret_key: "{{ aws_secret_key }}"
  register: ec2

- name: Terminate Temp EC2 Instance(s)
  ec2:
    instance_ids: '{{ item.instance_id }}'
    state: absent
    region: "{{ region }}"
    aws_access_key: "{{ aws_access_key }}"
    aws_secret_key: "{{ aws_secret_key }}"
  loop: "{{ ec2.instances }}"
Run Code Online (Sandbox Code Playgroud)