Ansible Playbook中Jinja循环变量迭代异常问题求助
问题根源
你犯了重复循环的错误:
- Playbook中已经通过
loop: "{{ conf_elements }}"遍历每一组变量,为每个主机生成单独的文件; - 但模板里又写了
{% for hostname, octet, mgmtip, id in conf_elements %},这会让每个文件都遍历整个变量列表,最终所有文件内容完全一致,完全不符合“每个文件对应一组变量”的预期。
修复方案
方案1:直接在模板中使用item变量
修改模板config-template_v0.1.j2,删除Jinja循环,直接引用Playbook循环传递的item元素:
! conf t hostname {{ item.0 }} mgmt 10.{{ item.1 }}.10.10 ip address 10.{{ item.1 }}.10.{{ item.2 }} descr location {{ item.3 }} !
方案2:解构变量让模板更易读
如果觉得item.0这类索引不够直观,可以在Playbook中解构变量,再传递给模板:
- 修改Playbook的任务部分:
- name: Create a New config file ansible.builtin.template: src: config-template_v0.1.j2 dest: "./CNFG/{{ hostname }}.txt" loop: "{{ conf_elements }}" vars: hostname: "{{ item.0 }}" octet: "{{ item.1 }}" mgmtip: "{{ item.2 }}" id: "{{ item.3 }}"
- 模板文件简化为:
! conf t hostname {{ hostname }} mgmt 10.{{ octet }}.10.10 ip address 10.{{ octet }}.10.{{ mgmtip }} descr location {{ id }} !
验证结果
修复后重新执行Playbook,CNFG目录下的每个文件都会只包含对应主机的配置,文件名和内容一一匹配。
内容的提问来源于stack exchange,提问作者O.K.
相关产品推荐
相关产品推荐

