2016-09-14 68 views
1

所以我有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個模板....如果我需要更多的文件,這不是可擴展....

+1

我很困惑,因爲你要求'{{host.SVIS ...',但是你將主機設置爲'interfaces [ansible_hostname]',所以它只是一個字符串,而不是字典。 – larsks

+0

我不這麼認爲。例如,如果我的模板就是這個 - > '' {{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從/變量選項 –

回答

1

你的問題有點不清楚(部分原因是我在指出問題的我註釋),但如果我理解你的要求,你可以這樣做:

IPADDR={{host.SVIS[item.vlan].ipv4}} 

見神社文檔的Variables部分,它說:

以下幾行做同樣的事情:

{{ foo.bar }} 
{{ foo['bar'] }} 

更新

你得到這個錯誤(「AnsibleUndefinedVariable:「字典對象有沒有屬性u'100' 」),因爲在你的字典鍵是整數,但vlan的值您的with_items循環中的鍵是字符串。也就是說,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 
+0

嘗試過,它不起作用:(看看我的評論迴應你上面的評論 –

+0

看到我的更新,這解釋了你錯誤的根源。 – larsks

+0

非常感謝你,很有意義。我認爲我認爲這些數字是字符串,因爲有了子變量的yml格式....猜我是愚蠢的 –

相關問題