---
- name: Hardware Requirements Check
hosts: all
gather_facts: yes
vars:
requirements:
min_cpu_count: 4
min_memory_gb: 8
min_total_disk_gb: 100
required_free_partition_gb: 50
check_results: []
tasks:
- name: Get CPU information
shell: nproc
register: cpu_count
- name: Get memory information (GB)
shell: free -g | grep '^Mem:' | awk '{print $2}'
register: memory_gb
- name: Get total disk space (GB)
shell: |
lsblk -b -o SIZE,TYPE | grep disk | awk '{sum+=$1} END {print int(sum/1024/1024/1024)}'
register: total_disk_gb
- name: Get largest unmounted partition size (GB)
shell: |
largest=$(lsblk -b -o SIZE,TYPE,MOUNTPOINT | grep 'part' | grep -v '/' | awk '{print $1}' | sort -nr | head -1)
if [ -n "$largest" ]; then
echo $((largest/1024/1024/1024))
else
echo "0"
fi
register: largest_unmounted_gb
- name: Check requirements
set_fact:
requirement_check:
hostname: "{{ inventory_hostname }}"
cpu_count: "{{ cpu_count.stdout | int }}"
memory_gb: "{{ memory_gb.stdout | int }}"
total_disk_gb: "{{ total_disk_gb.stdout | int }}"
largest_unmounted_gb: "{{ largest_unmounted_gb.stdout | int }}"
cpu_ok: "{{ (cpu_count.stdout | int) >= requirements.min_cpu_count }}"
memory_ok: "{{ (memory_gb.stdout | int) >= requirements.min_memory_gb }}"
disk_ok: "{{ (total_disk_gb.stdout | int) >= requirements.min_total_disk_gb }}"
free_partition_ok: "{{ (largest_unmounted_gb.stdout | int) >= requirements.required_free_partition_gb }}"
- name: Calculate overall status
set_fact:
requirement_check: "{{ requirement_check | combine({'overall_ok': requirement_check.cpu_ok and requirement_check.memory_ok and requirement_check.disk_ok and requirement_check.free_partition_ok}) }}"
- name: Add to results
set_fact:
check_results: "{{ check_results + [requirement_check] }}"
delegate_to: localhost
delegate_facts: true
- name: Display Requirements Check Results
hosts: localhost
gather_facts: no
tasks:
- name: Calculate summary statistics
set_fact:
total_nodes: "{{ check_results | length }}"
passed_nodes: "{{ check_results | selectattr('overall_ok', 'equalto', true) | list | length }}"
failed_nodes: "{{ check_results | selectattr('overall_ok', 'equalto', false) | list | length }}"
- name: Display summary
debug:
msg: |
================================================
HARDWARE REQUIREMENTS CHECK SUMMARY
================================================
Software Requirements:
- Minimum CPU Cores: {{ requirements.min_cpu_count }}
- Minimum Memory: {{ requirements.min_memory_gb }}GB
- Minimum Total Disk: {{ requirements.min_total_disk_gb }}GB
- Required Free Partition: {{ requirements.required_free_partition_gb }}GB
Check Results:
- Total Nodes: {{ total_nodes }}
- Passed: {{ passed_nodes }} nodes
- Failed: {{ failed_nodes }} nodes
- Success Rate: {{ ((passed_nodes / total_nodes * 100) | round(1)) }}%
- name: Display detailed results
debug:
msg: |
HOST: {{ item.hostname }} - {{ 'PASS' if item.overall_ok else 'FAIL' }}
├─ CPU: {{ item.cpu_count }} cores {{ '✓' if item.cpu_ok else '✗ (min: ' + (requirements.min_cpu_count | string) + ')' }}
├─ Memory: {{ item.memory_gb }}GB {{ '✓' if item.memory_ok else '✗ (min: ' + (requirements.min_memory_gb | string) + 'GB)' }}
├─ Total Disk: {{ item.total_disk_gb }}GB {{ '✓' if item.disk_ok else '✗ (min: ' + (requirements.min_total_disk_gb | string) + 'GB)' }}
└─ Free Partition: {{ item.largest_unmounted_gb }}GB {{ '✓' if item.free_partition_ok else '✗ (min: ' + (requirements.required_free_partition_gb | string) + 'GB)' }}
loop: "{{ check_results }}"
- name: List failed nodes
debug:
msg: |
⚠️ FAILED NODES ({{ failed_nodes }}):
{{ check_results | selectattr('overall_ok', 'equalto', false) | map(attribute='hostname') | join(', ') }}
when: failed_nodes > 0
- name: Generate requirements report
copy:
content: |
Hostname,CPU_Count,CPU_OK,Memory_GB,Memory_OK,Total_Disk_GB,Disk_OK,Largest_Free_Partition_GB,Free_Partition_OK,Overall_Status
{% for result in check_results -%}
{{ result.hostname }},{{ result.cpu_count }},{{ result.cpu_ok }},{{ result.memory_gb }},{{ result.memory_ok }},{{ result.total_disk_gb }},{{ result.disk_ok }},{{ result.largest_unmounted_gb }},{{ result.free_partition_ok }},{{ 'PASS' if result.overall_ok else 'FAIL' }}
{% endfor %}
dest: "./requirements_check_report.csv"
- name: Final status
debug:
msg: |
================================================
{{ 'ALL NODES READY FOR SOFTWARE INSTALLATION! 🎉' if failed_nodes == 0 else 'SOME NODES DO NOT MEET REQUIREMENTS ⚠️' }}
================================================
Report saved to: ./requirements_check_report.csv