Ansible with_nested 是笛卡尔积而非逐项配对
有道笔记的示例把卷、端口和镜像分别放进 with_nested,却在任务里按单个对象访问 item.name、item.tag 等属性。这个数据形状值得先核查:嵌套循环会组合每一组输入的每一个元素,item 代表一组元素,通常需要按 item.0、item.1 等位置访问。若三组各有 2 项,任务将运行 8 次,而非为 2 个容器各运行 1 次。
先确定希望得到哪种关系
| 目标 | 数据组织 | 应检查的结果 |
|---|---|---|
| 所有组合 | 使用 with_nested 或显式 product,并按位置引用每组的元素 | 任务次数是各组长度的乘积 |
| 一项对应一项 | 将同一对象的镜像、端口、卷放在同一个字典中,再遍历对象列表 | 任务次数等于对象数,属性从同一个 item 读取 |
在连接有写入效果的模块前,可先用 ansible.builtin.debug 输出组合项及循环次数;同时检查变量是否为空、字段是否存在、同名对象是否会被多次覆盖。来源示例中的目标看起来是一对象一组配置,但没有提供变量文件,无法判定真实意图,也未做运行验证。
适用范围:Ansible Playbook 的循环语义;来源笔记未记录 Ansible 或相关 collection 的版本。正式使用前应核对当前版本文档并用最小 Playbook 验证。
关联:Ansible 配置管理。