Loops 如何在jinja2中循环查看我的库存列表(目前正在使用我的剧本中的模板)

Loops 如何在jinja2中循环查看我的库存列表(目前正在使用我的剧本中的模板),loops,ansible,ansible-inventory,ansible-template,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['ansib

我正在尝试在一些网络设备上获取一些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上有循环。

一个选项是使用“hostvars”。见下文

hostname: {{ hostvars[host].ansible_hostname }}
Interfaces: {{ hostvars[host].ansible_interfaces }}
- template:
    src: ./template/temp.j2
    dest: report.txt
  run_once: true
- hosts: ios_devices
  gather_facts: yes
- hosts: localhost
  gather_facts: no
  tasks:
    - template:
        src: ./template/temp.j2
        dest: report.txt
“要执行此操作,Ansible必须已经与当前播放中的‘ios_设备’或播放手册中更高级别的另一个播放进行了对话。这是Ansible的默认配置。”请参阅

例如,像下面这样开始播放将缓存组“ios\U设备”中主机的事实

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

hostname: {{ hostvars[host].ansible_hostname }}
Interfaces: {{ hostvars[host].ansible_interfaces }}
- template:
    src: ./template/temp.j2
    dest: report.txt
  run_once: true
- hosts: ios_devices
  gather_facts: yes
- hosts: localhost
  gather_facts: no
  tasks:
    - template:
        src: ./template/temp.j2
        dest: report.txt
但是,由于模板中的条件(见下文),这将从“report.txt”中排除运行playbook的主机

{% if not host==inventory_hostname %}
缓存有关“ios_设备”的事实,并在不是“ios_设备”成员的主机上运行playbook(如果“ios_设备”的所有成员都应包含在“report.txt”中)。见下文

hostname: {{ hostvars[host].ansible_hostname }}
Interfaces: {{ hostvars[host].ansible_interfaces }}
- template:
    src: ./template/temp.j2
    dest: report.txt
  run_once: true
- hosts: ios_devices
  gather_facts: yes
- hosts: localhost
  gather_facts: no
  tasks:
    - template:
        src: ./template/temp.j2
        dest: report.txt

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

不清楚您希望在这里发生什么:当您的
主机
变量在
组中的值上循环时。ios_设备
,您没有在任何变量查找中使用该值,当然,在每个循环迭代中,您总是会看到相同的信息。你总是要求相同的变量。谢谢你@Vladimir Botka。这很有效。更重要的是,感谢您对概念的详细解释。