从Jinja2模板为多个主机生成单个配置

时间:2017-11-08 19:44:09

标签: ansible jinja2 ansible-template

问题:鉴于Ansible的性质,我有两个按顺序执行的任务(预期)。据我了解,每个任务只能执行一个模块。

任务1 - 从网络设备收集事实信息(连续出版物,版本等)。

任务2 - 使用在Task1

中收集的信息渲染模板

理想结果:由于我正在遍历大量网络设备,我理想的结果是一次选择一个设备,从中收集信息,然后使用该信息呈现模板,接下来转到循环中的其他设备,依此类推。

方法:我认为保持相同的语法,在任务1中将事实保存在文件(.json)和任务2上,读取JSON文件并获取变量I'我很感兴趣。

有没有更好的方法呢? (可能不止一个)

我目前所拥有的内容不符合我的目的,因为模板渲染时,它只包含有关最后一个设备的信息:

任务:roles / juniper.junos / tasks / main.yaml

- name: 1 - Gathering Facts
    junos_get_facts:
      host: "{{ inventory_hostname}}"
      user: ""
      passwd: ""
      savedir: "~/Ansible/Ouput/Facts"
    ignore_errors: True
    register: junos

- name: 2 - Creating the template
    template:
      src="~/Ansible/roles/juniper.junos/templates/template.j2"
      dest="~/Ansible/Ouput/Facts/Device_facts.yml"

模板:〜/ Ansible / roles / juniper.junos / templates / template.j2

{% for host in groups['OOB_AMS'] %}

   ANSIBLE NAME:                   {{ inventory_hostname}}

   HOSTNAME:               {{ junos.facts.hostname }}
   MODEL:                  {{ junos.facts.model }}
   SERIAL:                 {{ junos.facts.serialnumber }}
   VERSION:                {{ junos.facts.model }}
   UP TIME:                {{ junos.facts.RE0.up_time }}

{% endfor %}

IDEAL输出:“〜/ Ansible / Ouput / Facts / Device_facts.yml”

   ANSIBLE NAME:                   DEVICE 1

   HOSTNAME:               DEVICE 1 HOSTNAME
   MODEL:                  DEVICE 1 MODEL
   SERIAL:                 DEVICE 1 SERIAL
   VERSION:                DEVICE 1 VERSION
   UP TIME:                DEVICE 1 UP TIME

   ANSIBLE NAME:                   DEVICE 2

   HOSTNAME:               DEVICE 2 HOSTNAME
   MODEL:                  DEVICE 2 MODEL
   SERIAL:                 DEVICE 2 SERIAL
   VERSION:                DEVICE 2 VERSION
   UP TIME:                DEVICE 2 UP TIME

   ANSIBLE NAME:                   DEVICE 3

   HOSTNAME:               DEVICE 3 HOSTNAME
   MODEL:                  DEVICE 3 MODEL
   SERIAL:                 DEVICE 3 SERIAL
   VERSION:                DEVICE 3 VERSION
   UP TIME:                DEVICE 3 UP TIME

1 个答案:

答案 0 :(得分:1)

你用for变量写了host - 循环,但是一次也没用过它。

将模板更改为:

{% for host in ansible_play_hosts %}

   ANSIBLE NAME:                   {{ hostvars[host].inventory_hostname}}

   HOSTNAME:               {{ hostvars[host].junos.facts.hostname }}
   MODEL:                  {{ hostvars[host].junos.facts.model }}
   SERIAL:                 {{ hostvars[host].junos.facts.serialnumber }}
   VERSION:                {{ hostvars[host].junos.facts.model }}
   UP TIME:                {{ hostvars[host].junos.facts.RE0.up_time }}

{% endfor %}

循环groups['OOB_AMS']并不错,但硬编码组名称似乎没有必要。相反,您可以使用:ansible_play_hosts(版本2.2之前的play_hosts)。

同样为了清楚起见,您可以将run_once: true添加到template任务中。这并不重要,因为模板在每次迭代中都会生成相同的输出,因此无论如何都会跳过后续运行,但不需要多次执行。