코드 작성 배경
서버 반납을 위해 한번 더 스펙 체크를 하여 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]