如何重复已包含loop与变量映射的Ansible任务?
问题描述
现有如下Ansible任务,用于批量删除Cisco DNAC中的指定区域:
--- - name: Ansible Cisco DNAC Site Info hosts: dnac_servers vars_files: - pod2credentials.yml gather_facts: false tasks: ... other tasks omitted... - name: Delete_Areas_by_ID cisco.dnac.site_delete: dnac_host: "{{dnac_host}}" dnac_username: "{{dnac_username}}" dnac_password: "{{dnac_password}}" dnac_verify: "{{dnac_verify}}" dnac_port: "{{dnac_port}}" dnac_version: "{{dnac_version}}" dnac_debug: "{{dnac_debug}}" siteId: "{{ item }}" loop: "{{ areas_ids }}"
其中areas_ids已在前置任务中定义可用。需求是将整个Delete_Areas_by_ID任务重复执行固定次数(比如4次,次数可通过变量定义),尝试以下两种方法均报错:
- 添加计数器:提示任务已存在
loop,无法嵌套; - 将任务放入独立剧本,用
include_tasks结合with_sequence调用:提示无法使用嵌套映射。
解决方案
以下两种方法可实现需求:
方法一:使用嵌套循环(通过product过滤器生成笛卡尔积)
利用Ansible的product过滤器,将重复次数序列与areas_ids组合成二维列表,实现先遍历重复次数、再遍历所有区域ID的嵌套循环效果:
- name: Delete_Areas_by_ID (重复执行指定次数) cisco.dnac.site_delete: dnac_host: "{{dnac_host}}" dnac_username: "{{dnac_username}}" dnac_password: "{{dnac_password}}" dnac_verify: "{{dnac_verify}}" dnac_port: "{{dnac_port}}" dnac_version: "{{dnac_version}}" dnac_debug: "{{dnac_debug}}" siteId: "{{ item.1 }}" loop: "{{ range(1, repeat_count + 1) | product(areas_ids) | list }}" vars: repeat_count: 4 # 可替换为自定义变量
说明:
range(1, repeat_count + 1)生成1到指定次数的整数序列;product(areas_ids)将重复次数序列与区域ID列表做笛卡尔积,每个循环项item是[当前重复次数, 区域ID]的数组;- 任务会完整遍历所有区域ID执行删除,重复该流程直到达到指定次数。
方法二:修正include_tasks的调用语法
Ansible新版本推荐用loop代替旧的with_*插件,调整语法即可解决嵌套映射报错问题:
步骤1:提取独立任务文件
将删除区域的任务单独保存为CSS_dnac_site_delete_area.yml:
- name: Delete single area cisco.dnac.site_delete: dnac_host: "{{dnac_host}}" dnac_username: "{{dnac_username}}" dnac_password: "{{dnac_password}}" dnac_verify: "{{dnac_verify}}" dnac_port: "{{dnac_port}}" dnac_version: "{{dnac_version}}" dnac_debug: "{{dnac_debug}}" siteId: "{{ item }}" loop: "{{ areas_ids }}"
步骤2:主剧本中循环调用任务文件
在原剧本中用loop遍历重复次数序列,每次循环完整执行子任务中的所有区域删除操作:
- name: 重复执行删除区域任务 include_tasks: CSS_dnac_site_delete_area.yml loop: "{{ range(1, repeat_count + 1) | list }}" vars: repeat_count: 4 # 自定义重复次数变量
内容的提问来源于stack exchange,提问作者afranco.pt
相关产品推荐
相关产品推荐

