|
| 1 | +--- |
| 2 | +# BSD systems return IPv6 addresses in the order they were added to the interface, |
| 3 | +# not sorted by scope like Linux does. This means ansible_default_ipv6 often contains |
| 4 | +# a link-local address (fe80::) instead of a global address, which breaks certificate |
| 5 | +# generation due to the %interface suffix. |
| 6 | +# |
| 7 | +# This task file creates a fact with the first global IPv6 address found. |
| 8 | + |
| 9 | +- name: Initialize all_ipv6_addresses as empty list |
| 10 | + set_fact: |
| 11 | + all_ipv6_addresses: [] |
| 12 | + |
| 13 | +- name: Get all IPv6 addresses for the default interface |
| 14 | + set_fact: |
| 15 | + all_ipv6_addresses: "{{ ansible_facts[ansible_default_ipv6.interface]['ipv6'] | default([]) }}" |
| 16 | + when: |
| 17 | + - ansible_default_ipv6 is defined |
| 18 | + - ansible_default_ipv6.interface is defined |
| 19 | + - ansible_facts[ansible_default_ipv6.interface] is defined |
| 20 | + |
| 21 | +- name: Find first global IPv6 address from interface-specific addresses |
| 22 | + set_fact: |
| 23 | + global_ipv6_address: "{{ item.address }}" |
| 24 | + global_ipv6_prefix: "{{ item.prefix }}" |
| 25 | + loop: "{{ all_ipv6_addresses }}" |
| 26 | + when: |
| 27 | + - all_ipv6_addresses | length > 0 |
| 28 | + - item.address is defined |
| 29 | + - not item.address.startswith('fe80:') # Filter out link-local addresses |
| 30 | + - "'%' not in item.address" # Ensure no interface suffix |
| 31 | + - global_ipv6_address is not defined # Only set once |
| 32 | + loop_control: |
| 33 | + label: "{{ item.address | default('no address') }}" |
| 34 | + |
| 35 | +- name: Find first global IPv6 address from ansible_all_ipv6_addresses |
| 36 | + set_fact: |
| 37 | + global_ipv6_address: "{{ item | regex_replace('%.*', '') }}" |
| 38 | + global_ipv6_prefix: "128" # Assume /128 for addresses from this list |
| 39 | + loop: "{{ ansible_all_ipv6_addresses | default([]) }}" |
| 40 | + when: |
| 41 | + - global_ipv6_address is not defined |
| 42 | + - ansible_all_ipv6_addresses is defined |
| 43 | + - not item.startswith('fe80:') |
| 44 | + |
| 45 | +- name: Override ansible_default_ipv6 with global address on BSD |
| 46 | + set_fact: |
| 47 | + ansible_default_ipv6: "{{ ansible_default_ipv6 | combine({'address': global_ipv6_address, 'prefix': global_ipv6_prefix}) }}" |
| 48 | + when: |
| 49 | + - global_ipv6_address is defined |
| 50 | + - ansible_default_ipv6 is defined |
| 51 | + - ansible_default_ipv6.address.startswith('fe80:') or '%' in ansible_default_ipv6.address |
| 52 | + |
| 53 | +- name: Debug IPv6 address selection |
| 54 | + debug: |
| 55 | + msg: "Selected IPv6 address: {{ ansible_default_ipv6.address | default('none') }}" |
| 56 | + when: algo_debug | default(false) | bool |
0 commit comments