본문 바로가기
카테고리 없음

Ansible을 이용한 서버 스펙 확인

by eden.do 2022. 8. 31.

코드 작성 배경

서버 반납을 위해 한번 더 스펙 체크를 하여 Pool_type을 정리해야 했습니다. 처음 일부 서버 반납시에는 ansible 코드로 간단하게 shell, debug 모듈을 이용하였습니다. 각 CPU, memory, disk size 등을 ","로 엮어서 스펙을 출력하였고, 엑셀로 이차 작업을 해주어야 하는 불편함이 있어 아예 CPU, memory, disk 스펙을 보고 pool_type을 텍스트파일로 저장할 수 있도록 수정을 하였습니다. 서버 반납 작업을 직접 하지는 않지만 이번에 서버들을 확인하면서 실제 스펙과 분류된 스펙이 다른 경우도 있는 것을 확인하였습니다. 이번 반납 서버에는 A, B, C 타입만 포함되어 있어서 해당 타입별 분류만 진행하였습니다.

코드 실행 방법

정리 용도로 작성하는 것이기도 하고 미흡한 부분도 있어 깃허브에는 올리지 않았습니다. 실행 방법만 정리하도록 하겠습니다. 

edenui-MacBookPro:single_task root# cd /Users/eden/os_scripts/single_task
edenui-MacBookPro:single_task root# vi hosts #실행할 host들을 기입
[nodes]
eden-test-server-1.eden.io
eden-test-server-2.eden.io
eden-test-server-3.eden.io
edenui-MacBookPro:single_task root# ./check_hw.sh #ansible-playbook 스크립트 실행
 

코드 설명

  • os_scripts/single_task/check_hw.sh
_target="hosts.txt"

cat $_target
echo ""
echo -n "eden : "
ansible-playbook -i ${_target} --user eden ./tasks/check_hw.yml  -k      #hosts.txt에 적힌 호스트들을 대상으로 tasks/check_hw.yml을 eden 계정으로 실행시킵니다.
 
  • os_scripts/single_task/tasks/check_hw.yml
---
- name: collect facts for each node
  hosts: nodes
  serial: 1
  vars_files:
    - types_file # pool_type 항목들을 모아놓은 파일
  vars:
    - pool_type: "None"

  tasks:
    - name: Get Host, CPU, Memory, Disk info # ansible gather_fact 기능으로 수집된 정보들을 활용
      set_fact:
        host_name: "{{ansible_hostname}}"
        mac_address: "{{ansible_default_ipv4.macaddress}}"
        vendor: "{{ansible_system_vendor}}"
        CPU_model: "{{ansible_processor[2]}}"
        CPU_cores: "{{ansible_processor_cores}}"
        CPU_counts: "{{ansible_processor_count}}"
        Memory_total: "{{ansible_memtotal_mb}}"
        Disk_type: "{{ansible_devices|first}}"

    - name: Get Disk size TB # disk size가 TB인 경우 1.6 TB 이런식으로 출력되기 때문에 TB, GB에 따라 표시 방법을 달리 하였습니다.
      set_fact:
        Disk_size: "{{((disk_list[0]|float)*(1024|pow(4))/(1000|pow(4)))|round(2)}}"
        Disk_unit: "{{disk_list[1]}}"
      when: disk_list[1]=="TB"
      vars:
        disk_list: "{{ansible_devices[ansible_devices|first].size.split(' ')}}"

    - name: Get Disk size GB
      set_fact:
        Disk_size: "{{((disk_list[0]|float)*(1024|pow(3))/(1000|pow(3)))|round|int}}"
        Disk_unit: "{{disk_list[1]}}"
      when: disk_list[1]=="GB"
      vars:
        disk_list: "{{ansible_devices[ansible_devices|first].size.split(' ')}}"

    - name: Print Server spec # 내용 확인을 위해 출력 하는 부분
      debug:
        msg:
          - "HOST_name : {{host_name}}"
          - "MAC_address: {{mac_address}}"
          - "Vendor : {{vendor}}"
          - "CPU model : {{CPU_model}}"
          - "CPU_cores: {{CPU_cores}}"
          - "CPU_counts: {{CPU_counts}}"
          - "Memory Total : {{Memory_total}} MB"
          - "Memory MB to GB : {{((Memory_total|int)/1000)|round|int}} GB"
          - "Disk type : {{Disk_type}}"
          - "Disk size : {{Disk_size}} {{Disk_unit}}"

    - name: Check types # types_file에 있는 type에 맞으면 pool_type 변수에 저장
      set_fact:
        pool_type: "{{item[0]}}"
      when:
        - (item[1]|int)==((CPU_cores|int)*(CPU_counts|int))
        - (item[2]|int)==(((Memory_total|int)/1000)|round|int)
        - (item[3]|int)==(Disk_size|int)
        - (item[4])==(Disk_type)
      loop: "{{types}}"

    - name: Print pool_type to txt # 젠킨스 파라미터 양식에 맞게 hostname, mac_address pool_type으로 분류해서 저장
      local_action:
        module: lineinfile
        path: ./pool_type.txt
        create: true
        line: "{{host_name}},{{mac_address}} {{pool_type}}"

    - name: Print spec to txt # 자세한 스펙 정보를 보기 위해 저장 (기존 스펙으로 분류되지 않는 경우 스펙을 보기 위함)
      local_action:
        module: lineinfile
        path: ./info.txt
        create: true
        line:
          "****** {{host_name}},{{mac_address}} {{pool_type}}\n
          HOST_name : {{host_name}}\n
          MAC_address: {{mac_address}}\n
          Vendor : {{vendor}}\n
          CPU model : {{CPU_model}}\n
          CPU_cores: {{CPU_cores}}\n
          CPU_counts: {{CPU_counts}}\n
          Memory Total : {{Memory_total}} MB\n
          Memory MB to GB : {{((Memory_total|int)/1000)|round|int}} GB\n
          Disk type : {{Disk_type}}\n
          Disk size : {{Disk_size}} {{Disk_unit}}\n
          ------------------------------\n"
 
  • os_scripts/single_task/tasks/types_file
# type들을 아래와 같이 정의하였습니다. 나이스한 방법은 아닌거 같습니다..
types:
  - [타입 정보는 숨기겠습니다.]
 
  • os_scripts/single_task/tasks/pool_type.txt
# pool_type을 저장한 파일입니다. 분류되는 항목들이면 오른쪽에 타입이 나오고 분류되지 않는 항목들은 None으로 표시합니다.(여기에서는 None이라고 표시된 서버들은 960 ssd 였습니다.)
eden-test-server-1.eden.io,[mac_address] [Type]
eden-test-server-2.eden.io,[mac_address] None
eden-test-server-3.eden.io,[mac_address] [Type]
 
  • os_scripts/single_task/tasks/info.txt
# 아래와 같이 host_name, vendor, CPU, Memory, Disk 등의 정보를 따로 저장합니다.

****** eden-test-server-1.eden.io,[mac_address] [Type]
 HOST_name : eden-test-server-1.eden.io
 MAC_address: [mac_address]
 Vendor : [vendor명]
 CPU model : Intel...
 CPU_cores: [core 수]
 CPU_counts: [cpu 수]
 Memory Total : 32768 MB
 Memory MB to GB : 32 GB
 Disk type : [disk type]
 Disk size : [disk size]