所以我有3个主机我想要运行一个剧本。每个主机需要3个文件(都具有相同的名称)。
文件将是
每个文件都有一个唯一的IP地址,根据vars / file进入它。
任务看起来像这样 - >
Border
所以vars看起来像这样 - >
skip-name-resolve
现在问题来了。我不确定如何在同一时间使用with_items和vars所以我可以使用with_items来推迟使用哪个变量....这将大大简化剧本的复杂性
这是模板文件 - >
- 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
因此,如果我不在另一个{{}}内使用{{}},上述工作就会明显起作用。但你可以看到我在尝试什么。我可以使用item.X本身很好,我可以使用vars / fine中的任何东西。但我不知道该怎么办 host.SVIS [VLAN] .ipv4 ....
这可能吗?否则我将需要3个任务和3个模板....如果我需要更多文件,这不是可扩展的......答案 0 :(得分:1)
您的问题有点不清楚(部分原因是我在评论中指出的问题),但如果我理解您的要求,您可以执行以下操作:
IPADDR={{host.SVIS[item.vlan].ipv4}}
以下几行做同样的事情:
{{ foo.bar }} {{ foo['bar'] }}
<强>更新强>
您收到该错误(“AnsibleUndefinedVariable:'dict object'没有属性u'100'”),因为词典中的键是整数,但是with_items循环中vlan
键的值是字符串。也就是说,host.SVIS[100]
存在,但hosts.SVIS['100']
不存在。
鉴于这本剧本:
- hosts: localhost
vars:
interfaces:
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"
ansible_hostname: server01
tasks:
- name: configure subinterface bonds
template:
src: "ifcfg-lacpbondsub.j2"
dest: ./ifcfg-lacpbond.{{item.vlan}}
with_items:
- { vlan: 100 }
- { vlan: 200 }
- { vlan: 300 }
tags:
- bonding
这个模板:
{% set host = interfaces[ansible_hostname] -%}
DEVICE=lacpbond.{{item.vlan}}
IPADDR={{host.SVIS[item.vlan].ipv4}}
ONBOOT=yes
BOOTPROTO=none
VLAN=yes
Raw
我收到三个文件:
$ ls ifcfg-lacpbond.*
ifcfg-lacpbond.100 ifcfg-lacpbond.200 ifcfg-lacpbond.300
每个内容看起来像:
DEVICE=lacpbond.100
IPADDR=192.168.0.1
ONBOOT=yes
BOOTPROTO=none
VLAN=yes