我有一个任务如下:
-name : Set-up
shell: abc
register: "{{item }}_result"
loop: {{ setu }}
-name: set of tasks
include_tasks: abc.yml
when "'{{ item }}_result'.rc!=0"
loop: {{ setu }}
abc.yml
- name: step1
shell: {{ item.set }}
- name: step2
shell: {{ item.sertt }}
这里第一个任务预计针对 setu 的所有项目运行。那么,如何捕获变量中所有项目的 shell 命令的结果,并循环所有项目的任务文件,同时检查 item1 result.rc ! =0 类似地,item2 result.rc!=0 等等
在loop中注册的变量始终具有保存结果列表的属性result。例如,
- shell: echo {{ item }}_result
register: out
loop: "{{ setu }}"
vars:
setu: [a, b, c]
- debug:
msg: "{{ item.stdout }}"
loop: "{{ out.results }}"
loop_control:
label: "{{ item.cmd }}"
给出了删节版
msg: a_result
msg: b_result
msg: c_result
不可能循环块。请参阅Playbook 关键字。相反,您可以循环 include_tasks 或 import_tasks。将要迭代的任务放入文件中。例如,
shell> cat abc.yml
- debug:
msg: "step1: {{ item.stdout }}"
- debug:
msg: "step2: {{ item.stdout }}"
并迭代 include_tasks
- include_tasks: abc.yml
loop: "{{ out.results }}"
loop_control:
label: "{{ item.cmd }}"
给出了删节版
msg: 'step1: a_result'
msg: 'step2: a_result'
msg: 'step1: b_result'
msg: 'step2: b_result'
msg: 'step1: c_result'
msg: 'step2: c_result'
用于测试的完整剧本示例
- hosts: localhost
tasks:
- shell: echo {{ item }}_result
register: out
loop: "{{ setu }}"
vars:
setu: [a, b, c]
- debug:
msg: "{{ item.stdout }}"
loop: "{{ out.results }}"
loop_control:
label: "{{ item.cmd }}"
- include_tasks: abc.yml
loop: "{{ out.results }}"
loop_control:
label: "{{ item.cmd }}"