You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重复已包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:53:12