--- - name: Check Host Availability hosts: all gather_facts: false ignore_unreachable: true tasks: - name: Ping hosts to check availability ansible.builtin.ping: register: ping_result ignore_errors: true ignore_unreachable: true - name: Add reachable hosts to group ansible.builtin.group_by: key: reachable_hosts when: ping_result is succeeded - name: Report offline hosts ansible.builtin.debug: msg: "{{ inventory_hostname }} - OFFLINE" when: ping_result is not succeeded delegate_to: localhost - name: Disk and RAM Usage Report hosts: reachable_hosts become: true gather_facts: true tasks: - name: Get disk usage (excluding snap, overlay, tmpfs) ansible.builtin.shell: df -h --output=target,size,used,avail,pcent -x tmpfs -x devtmpfs -x squashfs -x overlay | tail -n +2 register: disk_usage changed_when: false - name: Calculate memory usage ansible.builtin.set_fact: mem_total_mb: "{{ ansible_memtotal_mb }}" mem_used_mb: "{{ ansible_memory_mb.real.used }}" mem_pct: "{{ ((ansible_memory_mb.real.used / ansible_memtotal_mb) * 100) | round(1) }}" swap_total_mb: "{{ ansible_swaptotal_mb }}" swap_used_mb: "{{ ansible_swaptotal_mb - ansible_swapfree_mb }}" - name: Print report ansible.builtin.debug: msg: | ====================================================== HOST: {{ inventory_hostname }} ({{ ansible_host }}) OS: {{ ansible_distribution }} {{ ansible_distribution_version }} ====================================================== RAM: {{ mem_used_mb }}MB / {{ mem_total_mb }}MB ({{ mem_pct }}%) SWAP: {{ swap_used_mb }}MB / {{ swap_total_mb }}MB ------------------------------------------------------ DISK: {{ disk_usage.stdout }} ====================================================== - name: Warn on high disk usage (>85%) ansible.builtin.debug: msg: "WARNING: {{ item.split()[-1] }} usage on {{ item.split()[0] }} of {{ inventory_hostname }}" loop: "{{ disk_usage.stdout_lines }}" when: (item.split()[-1] | replace('%','') | int) > 85