2017-06-08 51 views
0

我有一个网络与不同的主机和不同的网络,我想使用可以ping每个网络中的每个主机。得到一个dictonairy的子元素

在我的host_vars目录中,有关每个主机及其网络的所有信息都存储在它自己的文件中。一个hostfile看起来像这样:

bond: 
    - conn_name: net1 
    ip4: '10.10.44.21' 
    gw4: '10.10.44.1' 
    - conn_name: net2 
    ip4: '10.10.47.21' 
    gw4: '10.10.47.1' 
    - conn_name: net3 
    ip4: '10.10.46.21' 
    gw4: '10.10.46.1' 
bond_slave: 
    - conn_name: eno1 
    ifname: eno1 
    master: net1 
    - conn_name: eno2 
    ifname: eno2 
    master: net2 
    - conn_name: ens2f1 
    ifname: ens2f1 
    master: net2 
    - conn_name: ens2f0 
    ifname: ens2f0 
    master: net2 
    - conn_name: ens4f1 
    ifname: ens4f1 
    master: net3 
    - conn_name: ens4f0 
    ifname: ens4f0 
    master: net3 

我的目的是获得每个ip4值并从每台主机ping它。我可以做的是包含来自host_vars目录的所有文件,并ping每个文件的第一个bond项的ip-address。

--- 
- hosts: all 

- name: Include information about all hosts 
    include_vars: ../../host_vars/{{ item }}.yaml 
    with_items: hosts 
    register: "r" 

- name: execute ping 
    command: ping {{ bond[0].ip4 }} -c 3 
    with_items: "{{ r.results }}" 

但键可以具有从2至4级的网络。我如何通过每个债券循环访问所有的IP地址?

解决方案

即使康斯坦丁·苏沃洛夫的片段没有工作对我来说,它帮我找到合适的解决方案:

- name: execute ping 
    command: ping {{ item.ip4 }} -c 3 
    with_items: "{{ r.results | map(attribute='ansible_facts.bond') | list }}" 

回答

0

如果为每个主机定义bond变种通过host_vars,你可以使用hostvars魔术变量(不需要做这个丑陋的包含任务):

- name: ping everything 
    command: ping {{ item }} -c 3 
    with_items: "{{ play_hosts | map('extract',hostvars,'bond') | list }}" 

实际上,这个Jinja2表达式会返回一个列表列表,但是with_items会使它们变平,所以最终列出当前游戏中每个主机的每个键的所有元素。

+0

感谢您的帮助。它帮助我找到ping执行的正确语法。 – JustOneQuestion