0

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

任务 1 - 从网络设备收集事实信息(序列号、版本等)。

任务 2 - 使用任务 1 中收集的信息呈现模板

理想结果:由于我正在循环访问大量网络设备,我的理想结果是一次选择一个设备,从中收集信息,然后使用该信息渲染模板,然后转到循环中的另一个设备,然后很快。

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

有没有更好的方法来做到这一点?(应该不止一个)

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

任务:角色/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 %}

理想输出:“~/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
4

1 回答 1

1

你写了一个forhost变量的循环,但一次都没用过。

将模板更改为:

{% 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_hostsplay_hosts2.2 版之前)。

此外,为了清楚起见,您可以添加run_once: truetemplate任务中。这并不关键,因为模板在每次迭代中生成相同的输出,所以后面的运行无论如何都会被跳过,但没有必要重复几次。

于 2017-11-08T21:32:41.227 回答