问题:鉴于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
答案 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
任务中。这并不重要,因为模板在每次迭代中都会生成相同的输出,因此无论如何都会跳过后续运行,但不需要多次执行。