diff --git a/README.md b/README.md index 9c87a27..482e5e2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,165 @@ -# ansible_Jonny007MKD_interfaces +# Ansible Collection - Jonny007MKD.interfaces -The ansible collection Jonny007MKD.interfaces \ No newline at end of file +## Role gather_ip_interfaces + +Ansible facts contain information about the IP configuration in a non-optimal way (IMO). +This role restructures the facts and sets new variables: + +### interfaces + +A list of dicts containing the configuration of each network interfaces. +The specific content comes from the ansible variables; this is only an aggregate of all interface dictionaries. + + ok: [localhost] => { + "interfaces": [ + { + "active": true, + "device": "lo", + "features": { + "esp_hw_offload": "off [fixed]", + "esp_tx_csum_hw_offload": "off [fixed]", + "fcoe_mtu": "off [fixed]", + "generic_receive_offload": "on", + "generic_segmentation_offload": "on", + ... + }, + "hw_timestamp_filters": [], + "ipv4": { + "address": "127.0.0.1", + "broadcast": "", + "netmask": "255.0.0.0", + "network": "127.0.0.0", + "prefix": "8" + }, + "ipv6": [ + { + "address": "::1", + "prefix": "128", + "scope": "host" + } + ], + "mtu": 65536, + "promisc": false, + "timestamping": [], + "type": "loopback" + }, + { + "active": true, + "device": "wlo1", + "features": { + "esp_hw_offload": "off [fixed]", + "esp_tx_csum_hw_offload": "off [fixed]", + "fcoe_mtu": "off [fixed]", + "generic_receive_offload": "on", + "generic_segmentation_offload": "off [requested on]", + ... + }, + "hw_timestamp_filters": [], + "ipv4": { + "address": "192.168.1.100", + "broadcast": "192.168.1.255", + "netmask": "255.255.255.0", + "network": "192.168.1.0", + "prefix": "9" + }, + "ipv6": [ + { + "address": "fddc:ffeb:2910::206", + "prefix": "128", + "scope": "global" + }, + { + "address": "fddc:ffeb:2910:0:18c7:c3ff:efa6:35ae", + "prefix": "64", + "scope": "global" + } + ], + "macaddress": "18:c7:c3:a6:35:ae", + "module": "rtw88_8821ce", + "mtu": 1500, + "pciid": "0000:01:00.0", + "promisc": false, + "timestamping": [], + "type": "ether" + } + ] + } + + +## all_ipv4_addresses + +A list of dicts with the information about this machine's IPv4 networks + + ok: [localhost] => { + "all_ipv4_addresses": [ + { + "interface": "lo", + "address": "127.0.0.1", + "address_prefix": "127.0.0.1/8", + "broadcast": "", + "netmask": "255.0.0.0", + "network": "127.0.0.0", + "network_prefix": "127.0.0.0/8", + "prefix": "8" + }, + { + "interface": "wlo1", + "address": "192.168.1.100", + "address_prefix": "192.168.1.100/24", + "broadcast": "192.168.1.255", + "netmask": "255.255.255.0", + "network": "192.168.1.0", + "network_prefix": "192.168.1.0/24", + "prefix": "24" + } + ] + } + + + +### all_ipv6_addresses + +A list of dicts with the information about this machine's IPv6 networks + + ok: [localhost] => { + "all_ipv6_addresses": [ + { + "address": "::1", + "address_prefix": "::1/128", + "interface": "lo", + "prefix": "128", + "scope": "host" + }, + { + "address": "fddc:ffeb:2910::206", + "address_prefix": "fddc:ffeb:2910::206/128", + "interface": "wlo1", + "prefix": "128", + "scope": "global" + }, + { + "address": "fddc:ffeb:2910:0:18c7:c3ff:efa6:35ae", + "address_prefix": "fddc:ffeb:2910:0:18c7:c3ff:efa6:35ae/64", + "interface": "wlo1", + "prefix": "64", + "scope": "global" + }, + ] + } + +### Usage + +Simply include the role in your playbook: + + --- + - name: My playbook + hosts: localhost + connection: local + roles: + - Jonny007MKD.interfaces.gather_ip_interfaces + +Or include it in your role when you need it: + + - name: Gather IP facts on servers + ansible.builtin.import_role: + name: Jonny007MKD.interfaces.gather_ip_interfaces diff --git a/galaxy.yml b/galaxy.yml index 39786e7..5ef08e1 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -11,7 +11,10 @@ description: Network interface related roles license: - GPL-2.0-or-later -tags: [] +tags: +- interface +- ipv4 +- ipv6 dependencies: {} diff --git a/roles/gather_ip_interfaces/tasks/main.yml b/roles/gather_ip_interfaces/tasks/main.yml new file mode 100644 index 0000000..bcfad92 --- /dev/null +++ b/roles/gather_ip_interfaces/tasks/main.yml @@ -0,0 +1,51 @@ +- name: Gather network interfaces with `vars` name + ansible.builtin.set_fact: + _gather_ip_interfaces_with_vars_name: "{{ ansible_interfaces | map('regex_replace', '^', 'ansible_') | map('regex_replace', '[^a-zA-Z0-9]', '_') }}" + +- name: Gather network interface information + ansible.builtin.set_fact: + interfaces: "{{ _gather_ip_interfaces_with_vars_name | map('extract', vars) }}" + +- name: Gather all IPv4 addresses of interface + ansible.builtin.set_fact: + all_ipv4_addresses: "{{ (all_ipv4_addresses | default([])) + new_items }}" + loop: "{{ ansible_interfaces }}" + when: vars['ansible_' + item | regex_replace('[^a-zA-Z0-9]', '_')].ipv4 is defined + vars: + new_items: "{{ + ( + [vars['ansible_' + item | regex_replace('[^a-zA-Z0-9]', '_')].ipv4] + + vars['ansible_' + item | regex_replace('[^a-zA-Z0-9]', '_')].ipv4_secondaries | default([]) + ) | map('combine', {'interface': item}) + }}" + +- name: Gather all IPv6 addresses of interface + ansible.builtin.set_fact: + all_ipv6_addresses: "{{ (all_ipv6_addresses | default([])) + new_items }}" + loop: "{{ ansible_interfaces }}" + when: vars['ansible_' + item | regex_replace('[^a-zA-Z0-9]', '_')].ipv6 is defined + vars: + new_items: "{{ + vars['ansible_' + item | regex_replace('[^a-zA-Z0-9]', '_')].ipv6 | map('combine', {'interface': item}) + }}" + +- name: Compute additional info for IPv4 + ansible.builtin.set_fact: + all_ipv4_addresses: "{{ all_ipv4_addresses | difference([item]) | list + [item | combine(additional_info)] }}" + loop: "{{ all_ipv4_addresses }}" + vars: + additional_info: + network_prefix: "{{ item.network }}/{{ item.prefix }}" + address_prefix: "{{ item.address }}/{{ item.prefix }}" + loop_control: + label: "{{ item.interface }}: {{ item.address }}" + +- name: Compute additional info for IPv6 + ansible.builtin.set_fact: + all_ipv6_addresses: "{{ all_ipv6_addresses | difference([item]) | list + [item | combine(additional_info)] }}" + loop: "{{ all_ipv6_addresses }}" + vars: + additional_info: + address_prefix: "{{ item.address }}/{{ item.prefix }}" + loop_control: + label: "{{ item.interface }}: {{ item.address }}"