自动化-Ansible with_nested 是笛卡尔积而非逐项配对

Ansible with_nested 是笛卡尔积而非逐项配对

有道笔记的示例把卷、端口和镜像分别放进 with_nested,却在任务里按单个对象访问 item.nameitem.tag 等属性。这个数据形状值得先核查:嵌套循环会组合每一组输入的每一个元素item 代表一组元素,通常需要按 item.0item.1 等位置访问。若三组各有 2 项,任务将运行 8 次,而非为 2 个容器各运行 1 次。

先确定希望得到哪种关系

目标数据组织应检查的结果
所有组合使用 with_nested 或显式 product,并按位置引用每组的元素任务次数是各组长度的乘积
一项对应一项将同一对象的镜像、端口、卷放在同一个字典中,再遍历对象列表任务次数等于对象数,属性从同一个 item 读取

在连接有写入效果的模块前,可先用 ansible.builtin.debug 输出组合项及循环次数;同时检查变量是否为空、字段是否存在、同名对象是否会被多次覆盖。来源示例中的目标看起来是一对象一组配置,但没有提供变量文件,无法判定真实意图,也未做运行验证。

适用范围:Ansible Playbook 的循环语义;来源笔记未记录 Ansible 或相关 collection 的版本。正式使用前应核对当前版本文档并用最小 Playbook 验证。

关联:Ansible 配置管理