Infra & DevOps/Ansible

[Ansible] ์„œ๋ฒ„ ์ ๊ฒ€ ์Šคํฌ๋ฆฝํŠธ ์ž๋™ํ™” ๊ตฌํ˜„ ์‹ค์Šต - CPU ์ ์œ ์œจ

hyeyeonismm 2024. 4. 1. 13:30
Ansible Playbook์„ ์‚ฌ์šฉํ•ด์„œ Managed Node์˜ ์„œ๋ฒ„ ์ ๊ฒ€ ์ž๋™ํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์„ ๊ธฐ๋กํ–ˆ๋‹ค.

 

Ansible ์•„ํ‚คํ…์ฒ˜

 

VM์— ์„ค์น˜๋œ Rocky Linux 8.6์„ Control Node๋กœ ์ง€์ •ํ•˜๊ณ , EC2 ์„œ๋ฒ„๋ฅผ Managed Node๋กœ ์ง€์ •ํ•ด Managed Node์˜ ์„œ๋ฒ„ ์ ๊ฒ€ํ•˜๋Š” Playbook์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์„œ๋ฒ„ ์ ๊ฒ€ ์ž๋™ํ™”์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ–ˆ๋‹ค.

  • CPU ์ ์œ ์œจ
  • Memory ์ ์œ ์œจ
  • Disk ์‚ฌ์šฉ๋ฅ 
  • NIC ์‚ฌ์šฉ๋ฅ 

 

๋˜ํ•œ 1์‹œ๊ฐ„์— ํ•œ ๋ฒˆ์”ฉ ์ž๋™์œผ๋กœ ์Šค์ผ€์ค„๋งํ•˜์—ฌ ์œ„ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ 'YYYY_MM_DD_HH_์ž์›์ •๋ณด์ˆ˜์ง‘' ํ˜•์‹์˜ txtํŒŒ์ผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

 

CPU ์ ์œ ์œจ

top ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ–ˆ๋‹ค. top์˜ ๊ฒฐ๊ณผ ์ค‘ CPU ์‚ฌ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ , awk๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ ๋น„์œจ์„ ๊ณ„์‚ฐํ–ˆ๋‹ค. ์ด๋•Œ CPU ์‚ฌ์šฉ๋ฅ ์€ 100์—์„œ ์œ ํœด ์‹œ๊ฐ„์„ ๋นผ์„œ ๊ณ„์‚ฐํ•˜์˜€๋‹ค.

- name: CPU ์ ์œ ์œจ
  shell: "top -bn1 | grep 'Cpu(s)' | awk -F',' '{print $4}' | awk '{print 100 - $1}'"
  register: cpu_info
 
 - name: CPU ์ ์œ ์œจ ์ถœ๋ ฅ
   debug:
     msg: "CPU ์ ์œ ์œจ: {{ cpu_info['stdout'] }}%"

์ด ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š” cpu_info ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋ฉฐ, stdout์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๊ฐ’๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Memory ์ ์œ ์œจ

gather_facts๋กœ ๊ตฌํ•œ ์„œ๋ฒ„ ์ •๋ณด ์ค‘ memory_mb ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ด ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋‚˜๋ˆˆ ํ›„ 100์„ ๊ณฑํ•ด ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

- name: Memory ์ ์œ ์œจ
  set_fact:
    total_memory: "{{ ansible_facts['memory_mb']['real']['total'] }}"
    used_memory: "{{ ansible_facts['memory_mb']['real']['used'] }}"

- name: Memory ์ ์œ ์œจ ์ถœ๋ ฅ
  debug:
    msg: "Memory ์ ์œ ์œจ: {{ ((used_memory | float / total_memory | float ) * 100) | round(2) }}%"

 

Disk ์‚ฌ์šฉ๋ฅ 

๋””์Šคํฌ ์‚ฌ์šฉ๋ฅ ์€ gather_facts๋กœ ๊ตฌํ•œ ์„œ๋ฒ„ ์ •๋ณด ์ค‘ mounts ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„์˜ ์ฒซ ๋ฒˆ์งธ ๋งˆ์šดํŠธ๋œ ํŒŒํ‹ฐ์…˜์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ–ˆ๊ณ , mounts ๋ณ€์ˆ˜์˜ size_total๊ณผ size_available ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๊ณ„์‚ฐํ–ˆ๋‹ค.

- name: Disk ์‚ฌ์šฉ๋ฅ 
  set_fact:
    size_available: "{{ ansible_facts['mounts'][0]['size_available'] }}"
    size_total: "{{ ansible_facts['mounts'][0]['size_total'] }}"

- name: Disk ์‚ฌ์šฉ๋ฅ  ์ถœ๋ ฅ
  debug:
    msg: "Disk ์‚ฌ์šฉ๋ฅ : {{ ((1 - (size_available | float / size_total | float )) * 100) | round(2) }}%"

 

NIC ์‚ฌ์šฉ๋ฅ 

NIC ์‚ฌ์šฉ๋ฅ ์€ shell ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ–ˆ๋‹ค. ifconfig ๋ช…๋ น์–ด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋ณ„๋กœ ์ˆ˜์‹ (RX) ๋ฐ ์†ก์‹ (TX) ํŒจํ‚ท ์ˆ˜๋ฅผ ํ™•์ธํ–ˆ๋‹ค.

- name: NIC ์‚ฌ์šฉ๋ฅ 
  shell: |
    ifconfig | grep -E '^[a-zA-Z0-9]+|RX packets|TX packets'
  register: nic_info

 

๊ฒฐ๊ณผ ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์ €์žฅ

์ˆ˜์ง‘๋œ ์ •๋ณด๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์—์„œ, ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ์ •๋ณด๋กœ ํ˜•์„ฑ๋˜๋ฉฐ, ์ €์žฅ ๊ฒฝ๋กœ๋Š” /home/ansible/projects์— ๋‚ ์งœ๋ณ„ ํด๋”์™€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋„๋ก ํ–ˆ๋‹ค.

- name: ํŒŒ์ผ ์ €์žฅ ๋ณ€์ˆ˜
  set_fact:
    dir_dest: "/home/ansible/projects/{{ ansible_facts.date_time.date | replace('-', '_') }}"
    file_dest: "/home/ansible/projects/{{ ansible_facts.date_time.date | replace('-', '_') }}/{{ ansible_facts.date_time.date | replace('-', '_') }}_{{ ansible_facts.date_time.hour }}์‹œ_์ž์›์ •๋ณด์ˆ˜์ง‘.txt"

 

ํด๋” ์ƒ์„ฑ ๋ฐ ํŒŒ์ผ ๋‚ด์šฉ ์ž‘์„ฑ

- name: ํŒŒ์ผ ์ƒ์„ฑ
  file:
    path: "{{ dir_dest }}"
    state: directory
  delegate_to: localhost

- name: ๊ฒฐ๊ณผ ์ €์žฅ
  copy:
    content: |
      -------------------------------------------------------------------------------------
      Date: {{ ansible_facts.date_time.date }} {{ ansible_facts.date_time.time }}
      Hostname: {{ ansible_facts.hostname }}
      OS: {{ ansible_facts.distribution }} {{ ansible_facts.distribution_version }}
      OS Kernel: {{ ansible_facts.kernel }}
      CPU Cores: {{ ansible_facts.processor_vcpus }}
      Memory: {{ ansible_facts.memory_mb.real }}
      -------------------------------------------------------------------------------------
      CPU ์‚ฌ์šฉ๋ฅ : {{ cpu_info.stdout }}%
      Memory ์‚ฌ์šฉ๋ฅ : {{ ((used_memory | float / total_memory | float ) * 100) | round(2) }}%
      Disk ์‚ฌ์šฉ๋ฅ : {{ ((1 - (size_available | float / size_total | float )) * 100) | round(2) }}%
      NIC ์‚ฌ์šฉ๋ฅ : 
      {% for line in nic_info.stdout_lines %}
      {% if ':' in line %}
      {{ line.split(':')[0] }}
      {% elif 'RX packets' in line or 'TX packets' in line %}
        {{ line }} 
      {% endif %}
      {% endfor %}
    dest: "{{ file_dest }}"
  delegate_to: localhost

 

playbook ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

 

 

์˜ค๋Š˜ ๋‚ ์งœ ํด๋”์™€ ๋‚ ์งœ๋ณ„ ํŒŒ์ผ๋„ ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2024_04_01_11์‹œ_์ž์›์ •๋ณด์ˆ˜์ง‘.txt ํŒŒ์ผ