test0820d

Young-Kyoo Kim·2025년 8월 20일
---
- 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

0개의 댓글