如何在jinja2中遍历我的清单列表(当前使用我的剧本中的模板)

时间:2019-05-09 02:14:34

标签: loops ansible ansible-inventory ansible-template

我试图在某些网络设备上获取一些show命令的输出。我当前的代码在同一个主机上循环了4次,而不是清单文件中的所有4个主机上循环了。我该如何纠正?

使用Ubuntu 16.04服务器,Ansible 2.7

My Jinja template:
{% for host in groups.ios_devices %}
 {% if not host==inventory_hostname %}
.......
hostname: {{device_info.ansible_facts['ansible_net_hostname']}}
Interfaces: {{int_status}}
.......
 {% endif %}
{% endfor %}
## ios_devices is my host inventory file with all ip-addresses##

Playbook:
----------
 template:
       src: ./template/temp.j2
       dest: report.txt

我希望它可以在所有清单主机ip上运行,但是请确保输出在同一ip上具有循环。

1 个答案:

答案 0 :(得分:1)

一种选择是使用“ hostvars ”。见下文

hostname: {{ hostvars[host].ansible_hostname }}
Interfaces: {{ hostvars[host].ansible_interfaces }}

“为此,Ansible必须已经在当前剧本中与“ ios_devices ”进行了对话,或者在剧本中与更高版本进行了对话。这是ansible的默认配置。”参见Caching Facts

例如,以如下所示开始播放,将在“ ios_devices

组中缓存有关主机的事实
- hosts: ios_devices
  gather_facts: yes

但是,这将在组中的每个主机上运行剧本和' template '任务。为了避免这种情况,“ template ”任务可以为run_once。见下文

- template:
    src: ./template/temp.j2
    dest: report.txt
  run_once: true

但是,由于模板中的条件(请参见下文),这将从运行脚本的主机从 report.txt 中排除。

{% if not host==inventory_hostname %}

缓存有关“ ios_devices ”的事实,并在不是“ ios_devices ”成员的主机上运行剧本(如果“ ios_devices 的所有成员< / em>”应包含在“ report.txt ”中。见下文

- hosts: ios_devices
  gather_facts: yes
- hosts: localhost
  gather_facts: no
  tasks:
    - template:
        src: ./template/temp.j2
        dest: report.txt

或者,从模板中删除条件“ host == inventory_hostname ”。当然,将在运行“ 模板”任务的主机上创建文件“ report.txt ”。