【发布时间】:2016-09-14 03:10:07
【问题描述】:
所以我想在 3 台主机上运行剧本。每个主机需要 3 个文件(都具有相同的名称)。
文件将是
- lacpbond.100
- lacpbond.200
- lacpbond.300
每个文件都有一个基于 vars/ 文件的唯一 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 和 vars,所以我可以使用 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,也可以使用 vars/ 中的任何内容。但我不知道该怎么做 host.SVIS[VLAN].ipv4....
这可能吗?否则我将需要 3 个任务和 3 个模板......如果我需要更多文件,这不是可扩展的......
【问题讨论】:
-
我在这里很困惑,因为您要求
{{host.SVIS...,但您将主机设置为interfaces[ansible_hostname],所以它只是一个字符串,而不是字典。 -
我不这么认为。例如,如果我的模板只是这个-> `
{{item.vlan}}, {{host.SVIS.100.ipv4}}它会生成->100, 192.168.0.1但是如果我尝试{{host.SVIS[item.vlan].ipv4}} {{interfaces[ansible_hostname].SVIS[item.vlan].ipv4}}它同样会失败-> `failed: [server01] (item={u'vlan ': u'100'}) => {"failed": true, "item": {"vlan": "100"}, "msg": "AnsibleUndefinedVariable: 'dict object' 没有属性 u'100'"当我将项目变量与该文件夹中的变量结合起来时,它只会被破坏......我正在尝试使用 with_items 从 /vars 中选择项目