Como enumerar as interfaces de rede no Ansible

4

Gostaria de obter uma lista ordenada das interfaces de rede em uma máquina usando o Ansible. Sistemas Linux modernos não usam eth0, eth1, etc. Portanto, os nomes são imprevisíveis. Em nossa rede, conectamos a interface de número mais baixo à LAN e a mais alta à WAN, para que eu possa usar a posição da interface em uma lista ordenada para determinar sua função.

Estou procurando a maneira canônica de fazer isso no Ansible. Para que eu possa usar algo como {{ansible_eth0.ipv4.address}}. (Onde eth0 é algum outro nome).

Mesmo se eu definir manualmente uma variável com o nome da interface, não há como obter o IP dessa interface (usando o conteúdo da variável).

Gostaria de processar os fatos Ansible para obter o que eu quero, em vez de executar um script de shell no sistema remoto.

    
por Neik 06.04.2016 / 09:30

3 respostas

3

O ansible_interfaces fact lista todas as interfaces de rede existentes.

    
por 06.04.2016 / 11:22
1

Eu entendo de onde o Neik está vindo. Depois de experimentar um pouco, acho que encontrei uma tarefa que funcionará.

Como Michael Hamilton mencionou acima, o ansible_interfaces fact contém uma lista de todas as interfaces de rede e elas parecem estar em ordem (isto é, a primeira interface ethernet teria sido chamada eth0, a segunda eth1 etc.). Então, um pouco de set_fact de mágica e muita experiência depois:

- name: define traditional ethernet facts
  set_fact:
    ansible_eth: "{% set ansible_eth = ansible_eth|default([]) + [hostvars[inventory_hostname]['ansible_' + item]] %}{{ ansible_eth|list }}"
  when: hostvars[inventory_hostname]['ansible_' + item]['type'] == 'ether'
  with_items:
    - "{{ hostvars[inventory_hostname]['ansible_interfaces'] }}"

Isso faz um loop em todas as entradas ansible_interfaces da máquina atual e cria uma lista das entradas hostvars[inventory_hostname]['ansible_' + item] que têm type igual a "ether".

Portanto, agora ansible_eth.0 e ansible_eth.1 devem ser aproximadamente equivalentes aos antigos ansible_eth0 e ansible_eth1 , respectivamente.

Eu não testei completamente isso para garantir que o pedido sempre funcionasse como esperado, mas parece ser uma boa ideia.

Muito obrigado a esta resposta do StackOverflow por me mostrar como construir a lista usando o with_items.

    
por 24.05.2017 / 23:03
0

Já faz um tempo desde que toquei ansible, mas sem mais detalhes eu esperaria algo como:

ip link show | grep mode | sed 's/://g' | awk '{print $1,$2}'

para trabalhar ...

1 lo
2 eth0
    
por 06.04.2016 / 09:39

Tags