Ansible - 多个字典文件

时间:2016-12-16 03:10:24

标签: ansible ansible-playbook

剧本:

---
- hosts: switch
  connection: local
  gather_facts: no

  tasks:
  - name: GET DATA
    include_vars: ./host_vars/file.yml

  - name: GENERATE CONFIG
    template:
      src: ./templates/accessvlan.j2
      dest: ./output/{{ item.switch }}.conf
    with_items: 
    - '{{ab351E}}'
    - '{{ab361E}}'

变量文件:./host_vars/file.yml

---
ab351E:
- { switch: ab35-1E, port: Gi1/14, vlan: 1310 }
- { switch: ab35-1E, port: Gi1/29, vlan: 1382 }
- { switch: ab35-1E, port: Gi1/15, vlan: 1310 }

ab361E:
- { switch: ab36-1E, port: Gi1/15, vlan: 1410 }
- { switch: ab36-1E, port: Gi1/26, vlan: 1482 }
- { switch: ab36-1E, port: Gi1/17, vlan: 1410 }

Jinja2模板:/templates/accessvlan.j2

conf t
{% for host in ab351E %}
int {{ host.port }}
switchport access vlan {{ host.vlan }}
{% endfor %}
end
copy run start

我可以使上面的剧本没有问题。但是,如Jinja2模板中所示,我只能使用with_item中的一个字典变量(ab351E)。

如何编辑我的Jinja2模板,以便我可以使用with_item下的剧本中提到的字典变量(ab351E& ab361E)?

我的目标是生成2个配置文件:ab35-1E.conf& ab36-1E.conf。

ab35-1E.conf 文件如下所示:

conf t
int G1/14
switchport access vlan 1310
int G1/29
switchport access vlan 1382
int G1/15
switchport access vlan 1310
end
copy run start

1 个答案:

答案 0 :(得分:0)

我认为您可以使用include将项目传递给模板,以获得您想要的行为:

conf t
{% for host in item %}
int {{ host.port }}
switchport access vlan {{ host.vlan }}
{% endfor %}
end
copy run start

将此块移动到名为' generate_config.yml'

的文件中
- name: GENERATE CONFIG
  template:
    src: ./templates/accessvlan.j2
    dest: ./output/{{ item.switch }}.conf

在你的剧本中:

- name: generate all configs
  include: generate_config.yml
  with_items:
  . . .