Ansible中Jinja2模板循环时如何引用item变量的元素?
解决Ansible Jinja2模板遍历变量时无法引用内部元素的问题
我来帮你搞定这个问题!首先咱们得先确保你的变量结构是正确的,然后再调整Playbook和模板的写法,就能顺利生成对应dom1、dom2的文件啦。
第一步:确认domdb变量的正确结构
你的domdb应该是一个列表套字典的结构,每个字典里包含生成文件需要的name(用来指定输出文件名)、ip和mail字段。示例如下:
domdb: - name: dom1 ip: 192.168.1.10 mail: admin@dom1.com - name: dom2 ip: 192.168.1.11 mail: admin@dom2.com
第二步:编写正确的Ansible Playbook
用template模块配合loop(Ansible推荐的遍历方式,替代旧的with_items)来遍历domdb,同时指定每个文件的输出路径和名称:
- name: 生成域名配置文件 hosts: localhost # 根据你的实际目标主机调整 vars: domdb: - name: dom1 ip: 192.168.1.10 mail: admin@dom1.com - name: dom2 ip: 192.168.1.11 mail: admin@dom2.com tasks: - name: 创建每个域名的配置文件 template: src: domain.j2 # 你的Jinja2模板文件名 dest: "/tmp/{{ item.name }}.conf" # 输出路径,替换成你实际需要的路径 loop: "{{ domdb }}"
第三步:编写正确的Jinja2模板(domain.j2)
模板里直接通过item.字段名引用变量即可,注意不要加多余的标点(比如你之前写的{{ item.ip. }}多了个点,这会导致语法错误):
# 域名{{ item.name }}的配置文件 服务器IP: {{ item.ip }} 管理员邮箱: {{ item.mail }}
常见错误排查
- 变量结构错误:如果
domdb不是列表套字典(比如是单层字典或者嵌套错误),遍历的时候就找不到ip和mail字段,一定要确认变量结构符合要求。 - 模板语法错误:比如多余的标点、拼写错误(比如把
mail写成maill),都会导致无法引用变量。 - 文件名关联错误:如果
dest里没有用item.name,就无法生成对应dom1、dom2的独立文件,必须把输出文件名和遍历的每个元素绑定。
如果你的domdb变量是通过外部传入的(比如--extra-vars),要确保传入的格式正确,示例命令如下:
ansible-playbook your_playbook.yml --extra-vars '{"domdb": [{"name": "dom1", "ip": "192.168.1.10", "mail": "admin@dom1.com"}, {"name": "dom2", "ip": "192.168.1.11", "mail": "admin@dom2.com"}]}'
内容的提问来源于stack exchange,提问作者James W.
相关产品推荐
相关产品推荐

