在Ansible中有没有办法同时使用with_items和宿主变量?

时间:2016-09-14 03:10:08

标签: python ansible ansible-playbook

所以我有3个主机我想要运行一个剧本。每个主机需要3个文件(都具有相同的名称)。

文件将是

  • lacpbond.100
  • lacpbond.200
  • lacpbond.300

每个文件都有一个唯一的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个模板....如果我需要更多文件,这不是可扩展的......

1 个答案:

答案 0 :(得分:1)

您的问题有点不清楚(部分原因是我在评论中指出的问题),但如果我理解您的要求,您可以执行以下操作:

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

请参阅Jinja文档的enter image description here部分,其中包含:

  

以下几行做同样的事情:

{{ 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