所以我有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從/變量選項 –