所以我有3个主机我想运行一个剧本。每个主机需要3个文件(全部使用相同的名称)。在Ansible中有一种方法可以同时使用with_items和主变量吗?
的文件将是
- lacpbond.100
- lacpbond.200
- lacpbond.300
每个文件都有进入它基于一个唯一的IP地址变量/文件。
任务看起来像这个 - >
- name: configure subinterface bonds
template: src="ifcfg-lacpbondsub.j2" dest=/etc/sysconfig/network-scripts/ifcfg-lacpbond.{{item.vlan}}
with_items:
- { vlan: "100" }
- { vlan: "200" }
- { vlan: "300" }
tags:
- bonding
所以瓦尔看起来像这个 - >
server01:
loopbacks:
ipv4: "10.0.0.100"
SVIS:
100:
ipv4: "192.168.0.1"
prefix: "28"
200:
ipv4: "192.168.1.1"
prefix: "28"
300:
ipv4: "192.168.2.1"
prefix: "28"
现在,这里是问题。我不知道如何使用with_items和VAR在相同的时间,所以我可以用with_items推迟到使用的变量....这将大大简化了剧本
这里的复杂性是模板文件 - >
{% set host = interfaces[ansible_hostname] -%}
{% set VLAN = item.vlan -%}
DEVICE=lacpbond.{{item.vlan}}
IPADDR={{host.SVIS.{{item.vlan}}.ipv4}}
ONBOOT=yes
BOOTPROTO=none
VLAN=yes
因此上述作品很明显,如果我不使用{{}}中的另一个{{}}。但你可以看到我在尝试什么。我可以使用item.X本身很好,我可以使用任何从瓦尔/罚款。但我不知道如何做到这一点 host.SVIS [VLAN]否则,我将需要3个任务,3个模板....如果我需要更多的文件,这不是可扩展....
我很困惑,因为你要求'{{host.SVIS ...',但是你将主机设置为'interfaces [ansible_hostname]',所以它只是一个字符串,而不是字典。 – larsks
我不这么认为。例如,如果我的模板就是这个 - > '' {{item.vlan}}, {{host.SVIS.100.ipv4}}' 将generate-> '100, 192.168 .0.1' 但如果我尝试要么 '{{host.SVIS [item.vlan] .ipv4}} {{界面[ansible_hostname] .SVIS [item.vlan] .ipv4}}' 失败的与 - > '失败:[server01](item = {u'vlan':u'100'})=> {“failed”:true,“item”:{“vlan”:“100”}, msg“:”AnsibleUndefinedVariable:'字典对象'没有属性u'100'“} 其onl当我结合项目变量与该文件夹中的变量时,我打破了...我试图使用with_items从/变量选项 –