Files
ansible_proxmox_WOL/tasks/main.yml

158 lines
5.2 KiB
YAML
Raw Normal View History

---
# ============================================================
# Install required packages
# ============================================================
- name: Install required packages
ansible.builtin.apt:
name: ethtool
state: present
update_cache: true
# ============================================================
# Detect physical NICs with WOL support using Ansible facts
# ============================================================
- name: Gather network interface facts
ansible.builtin.setup:
gather_subset:
- network
when: ansible_facts.interfaces is not defined
- name: Display interfaces
ansible.builtin.debug:
msg: >
{{ ansible_facts.interfaces }}
# - name: Get interfaces starting with "en" or "eth"
# ansible.builtin.set_fact:
# en_interfaces: "{{ ansible_facts.interfaces | select('match', '^eth|^ens|^enp') | unique | list }}"
- name: Get interfaces starting with "en or "eth"
ansible.builtin.set_fact:
en_interfaces: >-
{{
ansible_facts.interfaces
| select('match', '^(eth|en)')
| list
}}
- name: Display debug selected interfaces
ansible.builtin.debug:
msg: >
{{ en_interfaces }}
- name: Check supported Wake-on-LAN modes
ansible.builtin.shell: "ethtool {{ item }} | grep 'Supports Wake-on' | tail -1 | awk '{print $3}'"
loop: "{{ en_interfaces }}"
register: wol_supported
changed_when: false
when: en_interfaces | length > 0
- name: WOL | Check if enabled
shell: >
ethtool {{ item }} | grep 'Wake-on' | tail -1 | awk '{print substr($0,length,1)}'
register: wol_enabled
changed_when: false
failed_when: false
loop: "{{ en_interfaces }}"
when: en_interfaces | length > 0
- name: Enable Wake-on-LAN (magic packet) when supported
ansible.builtin.command: "ethtool -s {{ item.0 }} wol {{ wol_mode }}"
loop: "{{ en_interfaces | zip(wol_enabled.results, wol_supported.results) | list }}"
loop_control:
label: "{{ item.0 }}"
when:
- "{{ wol_mode }} not in item.1.stdout"
- "{{ wol_mode }} in item.2.stdout"
# # ============================================================
# # Enable WOL immediately (only if needed)
# # ============================================================
# - name: Enable Wake-on-LAN immediately on NICs
# ansible.builtin.command: "ethtool -s {{ item }} wol {{ wol_mode }}"
# register: wol_enable_result
# changed_when: true
# loop: "{{ wol_needs_enable }}"
# loop_control:
# label: "{{ item }}"
# when: wol_needs_enable | length > 0
# # ============================================================
# # Persist WOL via udev rules (safe and idempotent)
# # ============================================================
# - name: Create udev rule content
# ansible.builtin.set_fact:
# wol_udev_rules: >-
# {{
# wol_final_interfaces
# | map('regex_replace', '^(.+)$', 'ACTION=="add", SUBSYSTEM=="net", KERNEL=="\1", RUN+="/sbin/ethtool -s \1 wol {{ wol_mode }}"')
# | list
# }}
# - name: Create/Update udev rules file
# ansible.builtin.copy:
# dest: /etc/udev/rules.d/90-wol.rules
# owner: root
# group: root
# mode: "0644"
# content: |
# # Wake-on-LAN udev rules - Auto-generated by Ansible
# # Applies to: {{ wol_final_interfaces | join(', ') }}
# {% for rule in wol_udev_rules %}
# {{ rule }}
# {% endfor %}
# notify:
# - Reload_udev_rules
# - Trigger_udev_net
# # ============================================================
# # Verification & Reporting
# # ============================================================
# - name: Verify Wake-on-LAN status
# ansible.builtin.command: "ethtool {{ item }}"
# register: wol_status
# changed_when: false
# loop: "{{ wol_final_interfaces }}"
# loop_control:
# label: "{{ item }}"
# when: wol_verify
# - name: Display WOL status per interface
# ansible.builtin.debug:
# msg: >
# Interface {{ item.item }} WOL Status:
# {{ item.stdout_lines | select('search', 'Wake-on:') | first | default('Status Unknown') }}
# loop: "{{ wol_status.results | default([]) }}"
# loop_control:
# label: "{{ item.item }}"
# when: wol_verify
# - name: Get MAC addresses for all interfaces
# ansible.builtin.set_fact:
# wol_mac_addresses: >-
# {{
# wol_final_interfaces
# | map('extract', hostvars[inventory_hostname]['ansible_' ~ item] | default({}), 'macaddress')
# | list
# }}
# - name: Report WOL configuration
# ansible.builtin.debug:
# msg: |
# Wake-on-LAN Configuration Summary:
# ===================================
# Bridges Configured: {{ wol_bridges_list | join(', ') }}
# Physical Interfaces: {{ wol_final_interfaces | join(', ') }}
# WOL Mode: {{ wol_mode }}
# {% if wol_has_bond0 | default(false) %}
# Bond0 Detected: Yes
# Bond0 Slaves: {{ wol_bond0_slaves | join(', ') }}
# {% endif %}
# {% if wol_report_mac and wol_mac_addresses | length > 0 %}
# MAC Addresses:
# {% for iface, mac in (wol_final_interfaces | zip(wol_mac_addresses) | list) %}
# - {{ iface }}: {{ mac | default('Unable to detect') }}
# {% endfor %}
# {% endif %}