O ansible_interfaces
fact lista todas as interfaces de rede existentes.
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.
O ansible_interfaces
fact lista todas as interfaces de rede existentes.
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.
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
Tags ansible