2016-09-14 69 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格式....猜我是愚蠢的 –

相关问题