Execution
Date 22 Jul 2025 11:44:25 +0100
Duration 00:00:05.69
Controller ssh-gw-4.layershift.com
User root
Versions
Ansible 2.16.11
ara 1.7.2 / 1.7.2
Python 3.10.10
Summary
1 Hosts
7 Tasks
7 Results
1 Plays
1 Files
0 Records

File: /home/ssh-gateway/ansible/kuly/get_mac_addresses.yaml

---
- name: Determine primary physical interface and write hostname-interface-mac to file
  hosts: all
  gather_facts: no
  become: yes

  tasks:
    - name: Gather system facts
      setup:
        filter: ansible_default_ipv4,ansible_interfaces,ansible_env

    - name: Get hostname
      command: hostname -s
      register: host_name
      changed_when: false

    - name: Set primary interface from default route
      set_fact:
        primary_interface: "{{ ansible_default_ipv4.interface }}"

    - name: Debug - Found primary interface
      debug:
        msg: "Primary interface is {{ primary_interface }}"

    - name: Check if the primary interface is a bridge (using ip link)
      command: ip link show type bridge {{ primary_interface }}
      register: bridge_check
      ignore_errors: yes

    - name: Get physical interfaces part of the bridge (if primary is a bridge)
      command: bridge link show master {{ primary_interface }}
      when: bridge_check.rc == 0
      register: bridge_members
      changed_when: false

    - name: Extract physical interface names from bridge members
      set_fact:
        physical_interfaces: >
          {{
            (bridge_members.stdout_lines | map('regex_search', r'.*dev (\S+)') | select | map('first') | list)
            if bridge_check.rc == 0
            else [primary_interface]
          }}

    - name: Ensure at least one physical interface is found
      fail:
        msg: "No physical interface could be determined."
      when: physical_interfaces is undefined or physical_interfaces | length == 0

    - name: Get MAC address for each physical interface
      set_fact:
        interface_mac_list: |
          {% set result = [] %}
          {% for iface in physical_interfaces %}
            {% if hostvars[inventory_hostname]['ansible_' + iface] is defined %}
              {% set _ = result.append({
                'interface': iface,
                'mac': (hostvars[inventory_hostname]['ansible_' + iface]).get('macaddress')
              }) %}
            {% endif %}
          {% endfor %}
          {{ result }}

    - name: Fail if MAC address not found for any interface
      fail:
        msg: "Could not retrieve MAC address for any physical interface."
      when: interface_mac_list | length == 0

    - name: Write hostname-interface-mac to file
      copy:
        content: |
          {% for item in interface_mac_list %}
          {{ host_name.stdout }} - {{ item.interface }} - {{ item.mac }}
          {% endfor %}
        dest: /tmp/interface_mac.txt
        owner: root
        group: root
        mode: '0644'

    - name: Display result
      debug:
        msg: "Result written to /tmp/interface_mac.txt:\n{{ lookup('file', '/tmp/interface_mac.txt') }}"