如何使用with_sequence在Ansible角色中循环执行两个任务
问题场景
- 需要使用
with_sequence循环执行两个独立任务,循环变量{{ item }}的值为对应栈的名称。 - 对于
with_sequence生成的0到10的每一个整数值,都要先执行一次task1、再执行一次task2,按序号递增顺序逐个完成“task1→task2”的流程。
原有实现代码运行失败,失败代码如下:
# /roles/app1/tasks/main.yml --- - name: Include env vars to pass to tasks include_vars: file: "./roles/app1/vars/{{ cluster }}_vars.yml" # tasks file for infra - name: Run through each task in serial using with_sequence include_tasks: - ./roles/app1/tasks/task1.yml - ./roles/app1/tasks/task2.yml with_sequence: "start=0 end=10"
失败原因
include_tasks模块单次仅支持引入单个任务文件,直接传入文件列表属于语法错误,任务执行时会直接报参数异常。- 即便调整语法让循环适配文件列表,执行顺序也会偏离需求:会先把0-10所有序号的task1全部跑完,再统一跑0-10所有序号的task2,不符合每个序号下“先task1后task2”的串行要求。
正确实现方案
通过新增一个中间调度任务文件,把单次循环需要执行的两个任务按顺序写入,外层通过with_sequence循环引入这个中间文件即可,循环变量{{ item }}会自动透传给所有子任务。
首先修改入口任务文件/roles/app1/tasks/main.yml:
# /roles/app1/tasks/main.yml --- - name: 加载任务所需环境变量 include_vars: file: "./roles/app1/vars/{{ cluster }}_vars.yml" - name: 按序号串行执行全流程 include_tasks: ./roles/app1/tasks/run_single_stack.yml with_sequence: "start=0 end=10"
新增中间调度文件/roles/app1/tasks/run_single_stack.yml,内容如下:
# /roles/app1/tasks/run_single_stack.yml --- - name: 执行当前序号对应task1 include_tasks: ./roles/app1/tasks/task1.yml - name: 执行当前序号对应task2 include_tasks: ./roles/app1/tasks/task2.yml
方案说明
- 执行顺序完全匹配需求:从序号0开始,先跑task1再跑task2,完成后自动进入序号1的流程,直到序号10执行结束。
- 外层循环生成的
{{ item }}变量可以在task1、task2文件中直接调用,不需要额外做变量传递。 - 注意:不要用
import_tasks替换此处的include_tasks,import_tasks是静态导入,在playbook加载阶段就会完成解析,无法支持逐次循环的动态执行逻辑。
内容的提问来源于stack exchange,提问作者mildlyokatcomputers
相关产品推荐
相关产品推荐

