앤서블을 사용하여 CPU, 메모리, 디스크 사용률을 좀 더 자세하게 살펴볼 수 있는 dstat, iostat, vmstat과 같은 명령어를 이용해 관리 노드의 CPU, 메모리, 디스크 사용률을 모니터링 해보겠습니다.
앤서블 테스트 환경
앤서블 서버 (1대) : Ubuntu 22.04
관리 노드 서버 (3대) : Ubuntu 22.04
– ubuntu_1
– ubuntu_2
– ubuntu_3
KVM 및 virt-manager 설치
CPU 가상화 여부 확인
# cat /proc/cpuinfo | egrep “vmx|svm”
시스템 업데이트
# apt update -y
kvm 관련 패키지 설치
# apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
virt-manager 설치
# apt install virt-manager
앤서블 설치하기
# apt install software-properties-common
# add-apt-repository –yes –update ppa:ansible/ansible
# apt install ansible
# ansible –version
ansible [core 2.15.6]
config file = /etc/ansible/ansible.cfg
configured module search path = [‘/root/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’]
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] (/usr/bin/python3)
jinja version = 3.0.3
libyaml = True
인벤토리를 이용한 자동화 대상 호스트 설정
인벤토리 파일은 텍스트 파일이며, 앤서블이 자동화 대상으로 하는 호스트들을 작성할 수 있습니다.
.ini 또는 .yaml 형식을 사용하여 작성이 가능합니다.
[IP를 이용한 인벤토리 파일 생성]
// my-ansible 디렉토리 생성
# midlr my-ansible
# cd my-ansible
// IP를 이용한 inventory 파일 생성
# vi inventory
115.68.xxx.xxx
115.68.xxx.xxx
115.68.xxx.xxx
[호스트명을 이용한 인벤토리 파일 생성]
// /etc/hosts에 자동화 대상 호스트 등록
# vi /etc/hosts
115.68.xxx.xxx ubuntu_1
115.68.xxx.xxx ubuntu_2
115.68.xxx.xxx ubuntu_3
// 호스트명을 이용한 inventory 파일 생성
# vi inventory
[group]
ubuntu_1
ubuntu_2
ubuntu_3
ansible-inventory 명령어와 –graph 옵션을 이용하면 트리 형태로 인벤토리 정보를 확인할 수 있습니다.
# ansible-inventory -i ./inventory –graph
@all:
|–@ungrouped:
|–@TEST:
| |–115.68.xxx.xxx
| |–115.68.xxx.xxx
| |–115.68.xxx.xxx
앤서블 환경 설정 파일 생성
# vi ansible.cfg
[defaults]
inventory=./inventory
remote_user=user
ask_pass=false
[privilege_escalation]
become=true
become_method=sudo
become_user=root
become_ask_pass=false
앤서블 접근을 위한 SSH 인증 구성
로컬 사용자에게 개인 ssh 키가 있거나, 관리 호스트에서 원격 사용자임을 인증 가능한 키가 구성된 경우 자동으로 로그인됩니다.
ssh-keygen 명령어를 이용하여 다음과 같이 생성할 수 있습니다.
ssh-copy-id 명령어를 이용하여 ssh 공개 키를 해당 호스트로 복사할 수 있습니다.
// ssh-keygen 명령어를 이용하여 ssh 키를 생성
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): [Enter]
Enter passphrase (empty for no passphrase): [Enter]
Enter same passphrase again: [Enter]
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:ljbRuQYIJajlnEelgqLDgXA4fvvd03krrL0J6a9xax0 root@wnwls648-228122
The key’s randomart image is:
+—[RSA 3072]—-+
|….ooo |
|=oo .+ . . . |
|=B.o. . o o |
|=.=o. + . |
|o…. S o |
| . . o o. E |
| . . .+o.o . |
| . ..o=*oo |
| +**+.. |
+—-[SHA256]—–+
// ssh-copy-id 명령어를 이용하여 관리 노드로 ssh 키를 복사 (ubuntu_1, ubuntu_2, ubuntu_3 서버에 모두 복사)
# ssh-copy-id root@115.68.xxx.xxx
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/root/.ssh/id_rsa.pub”
The authenticity of host ‘115.68.xxx.xxx (115.68.xxx.xxx)’ can’t be established.
ED25519 key fingerprint is SHA256:JXxBdzJ6fWgEBJypkDFMyN5LTFvQ8tqiWYGXDTt7x7Q.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
root@115.68.xxx.xxx’s password:
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘root@115.68.xxx.xxx'”
and check to make sure that only the key(s) you wanted were added.
ansible 명령어를 이용하여 ping 테스트를 진행합니다.
정상적으로 통신이 이루어질 시 ‘SUCCESS’ 라는 메시지를 볼 수 있습니다.
# ansible -m ping TEST -k
SSH password:
115.68.xxx.xxx | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python3”
},
“changed”: false,
“ping”: “pong”
}
115.68.xxx.xxx | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python3”
},
“changed”: false,
“ping”: “pong”
}
115.68.xxx.xxx | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python3”
},
“changed”: false,
“ping”: “pong”
}
앤서블 플레이북 작성하기
변수정의를 위해 아래의 파일을 생성하고, 변수와 변수값을 정의합니다.
# vi vars_packages.yml
—
log_directory: /home/ansible/logs
packages:
– dstat
– sysstat
변수 정의가 끝나면 monitoring_system.yml 파일을 생성하여 플레이북을 작성합니다.
# vi monitoring_system.yml
—
– hosts: TEST
vars_files: vars_packages.yml
tasks:
– name: Install packages on Ubuntu
ansible.builtin.apt:
name: “{{ item }}”
state: present
loop: “{{ packages }}”
when: ansible_facts.os_family == “Debian”
– name: Monitoring dstat
ansible.builtin.shell: |
{{ item }} >> {{ log_directory }}/dstat.log
loop:
– dstat 2 10
– dstat -cmdlt -D vda 2 10
– name: Monitoring iostat
ansible.builtin.shell: |
{{ item }} >> {{ log_directory }}/iostat.log
loop:
– iostat
– echo “=====================”
– iostat -t -c -dp vda
– echo “=====================”
– name: Monitoring vmstat
ansible.builtin.shell: |
{{ item }} >> {{ log_directory }}/vmstat.log
loop:
– vmstat
– echo “=====================”
– vmstat -dt
– echo “=====================”
– vmstat -D
– echo “=====================”
– name: Monitoring df
ansible.builtin.shell: |
df -h >> {{ log_directory }}/df.log
앤서블 플레이북 실행하기
플레이북을 실행하기 전에, 문법 오류가 없는지 아래 명령어를 통해 체크합니다.
문법에 오류가 없다면 아래와 같은 메시지가 확인됩니다.
# ansible-playbook –syntax-check monitoring_system.yml
playbook: monitoring_system.yml
문법에 문제가 없다면 ansible-playbook 명령어를 이용하여 실행합니다.
# ansible-playbook monitoring_system.yml
PLAY [TEST] **********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [115.68.249.254]
ok: [115.68.249.251]
ok: [115.68.249.205]
TASK [Install packages on Ubuntu] ************************************************************************************
ok: [115.68.249.254] => (item=dstat)
ok: [115.68.249.205] => (item=dstat)
ok: [115.68.249.251] => (item=dstat)
ok: [115.68.249.254] => (item=sysstat)
ok: [115.68.249.205] => (item=sysstat)
ok: [115.68.249.251] => (item=sysstat)
TASK [Monitoring dstat] **********************************************************************************************
changed: [115.68.249.254] => (item=dstat 2 10)
changed: [115.68.249.205] => (item=dstat 2 10)
changed: [115.68.249.251] => (item=dstat 2 10)
changed: [115.68.249.254] => (item=dstat -cmdlt -D vda 2 10)
changed: [115.68.249.205] => (item=dstat -cmdlt -D vda 2 10)
changed: [115.68.249.251] => (item=dstat -cmdlt -D vda 2 10)
TASK [Monitoring iostat] *********************************************************************************************
changed: [115.68.249.254] => (item=iostat)
changed: [115.68.249.205] => (item=iostat)
changed: [115.68.249.251] => (item=iostat)
changed: [115.68.249.254] => (item=echo “=====================”)
changed: [115.68.249.254] => (item=iostat -t -c -dp vda)
changed: [115.68.249.205] => (item=echo “=====================”)
changed: [115.68.249.251] => (item=echo “=====================”)
changed: [115.68.249.254] => (item=echo “=====================”)
changed: [115.68.249.251] => (item=iostat -t -c -dp vda)
changed: [115.68.249.205] => (item=iostat -t -c -dp vda)
changed: [115.68.249.205] => (item=echo “=====================”)
changed: [115.68.249.251] => (item=echo “=====================”)
TASK [Monitoring vmstat] *********************************************************************************************
changed: [115.68.249.254] => (item=vmstat)
changed: [115.68.249.251] => (item=vmstat)
changed: [115.68.249.205] => (item=vmstat)
changed: [115.68.249.254] => (item=echo “=====================”)
changed: [115.68.249.254] => (item=vmstat -dt)
changed: [115.68.249.251] => (item=echo “=====================”)
changed: [115.68.249.205] => (item=echo “=====================”)
changed: [115.68.249.254] => (item=echo “=====================”)
changed: [115.68.249.251] => (item=vmstat -dt)
changed: [115.68.249.205] => (item=vmstat -dt)
changed: [115.68.249.254] => (item=vmstat -D)
changed: [115.68.249.254] => (item=echo “=====================”)
changed: [115.68.249.251] => (item=echo “=====================”)
changed: [115.68.249.205] => (item=echo “=====================”)
changed: [115.68.249.251] => (item=vmstat -D)
changed: [115.68.249.205] => (item=vmstat -D)
changed: [115.68.249.251] => (item=echo “=====================”)
changed: [115.68.249.205] => (item=echo “=====================”)
TASK [Monitoring df] *************************************************************************************************
changed: [115.68.249.254]
changed: [115.68.249.251]
changed: [115.68.249.205]
PLAY RECAP ***********************************************************************************************************
115.68.249.205 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
115.68.249.251 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
115.68.249.254 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
플레이북이 정상적으로 실행이 완료되면 위와 같이 OK 메시지를 확인할 수 있습니다.
플레이북이 실행될때, apt를 이용하여 패키지가 설치되는것을 확인할 수 있으며, 이어서 각각의 명령어가 실행되는 것도 확인할 수있습니다.
플레이북 실행이 완료되었다면, 관리 노드에 접속하여 로그 디렉토리에 로그 파일이 생성되었는지 확인합니다.
[ubuntu_1.exp.com 서버]
root@ubuntu1:~# cd /home/ansible/logs/
root@ubuntu1:/home/ansible/logs# ll
total 24
drwxr-xr-x 2 root root 4096 11월 17 15:08 ./
drwxr-xr-x 3 root root 4096 11월 17 15:06 ../
-rw-r–r– 1 root root 325 11월 17 15:08 df.log
-rw-r–r– 1 root root 1903 11월 17 15:07 dstat.log
-rw-r–r– 1 root root 2566 11월 17 15:07 iostat.log
-rw-r–r– 1 root root 1731 11월 17 15:07 vmstat.log
확인된 로그 파일들의 내용을 cat 명령어로 다음과 같이 확인합니다.
root@ubuntu1:/home/ansible/logs# cat df.log
Filesystem Size Used Avail Use% Mounted on
tmpfs 393M 1000K 392M 1% /run
/dev/vda1 49G 2.6G 46G 6% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda15 105M 6.1M 99M 6% /boot/efi
tmpfs 393M 4.0K 393M 1% /run/user/0
root@ubuntu1:/home/ansible/logs# cat dstat.log
You did not select any stats, using -cdngy by default.
–total-cpu-usage– -dsk/total- -net/total- —paging– —system–
usr sys idl wai stl| read writ| recv send| in out | int csw
0 0 99 0 0| 315M 3500M| 0 0 | 0 0 |3699k 4683k
0 0 100 0 0| 0 114k| 0 0 | 0 0 | 27 38
0 0 100 0 0| 0 0 | 0 0 | 0 0 | 14 27
0 0 100 0 0| 0 56k| 0 0 | 0 0 | 20 30
0 0 100 0 0| 0 0 | 0 0 | 0 0 | 12 23
0 0 100 0 0| 0 0 | 0 0 | 0 0 | 12 20
0 0 100 0 0| 0 0 | 29B 27B| 0 0 | 14 24
0 0 100 0 0| 0 6144B| 0 0 | 0 0 | 18 26
0 0 100 0 0| 0 0 | 27B 27B| 0 0 | 14 24
0 0 100 0 0| 0 0 | 0 0 | 0 0 | 12 20
–total-cpu-usage– ——memory-usage—– –dsk/vda– —load-avg— —-system—-
usr sys idl wai stl| used free buff cach| read writ| 1m 5m 15m | time
0 0 99 0 0| 235M 1354M 80.3M 2065M| 292M 3501M|0.06 0.02 0|17-11 15:07:37
0 0 100 0 0| 235M 1354M 80.3M 2065M| 0 44k|0.06 0.01 0|17-11 15:07:39
0 0 100 0 0| 235M 1354M 80.3M 2065M| 0 0 |0.06 0.01 0|17-11 15:07:41
0 0 100 0 0| 235M 1354M 80.3M 2065M| 0 2048B|0.05 0.01 0|17-11 15:07:43
0 0 99 1 0| 235M 1354M 80.3M 2065M| 0 252k|0.05 0.01 0|17-11 15:07:45
0 0 100 0 0| 235M 1354M 80.3M 2065M| 0 0 |0.05 0.01 0|17-11 15:07:47
0 0 100 0 0| 235M 1354M 80.3M 2065M| 0 0 |0.05 0.01 0|17-11 15:07:49
0 0 100 0 0| 235M 1354M 80.3M 2065M| 0 66k|0.05 0.01 0|17-11 15:07:51
0 0 100 0 0| 235M 1354M 80.3M 2065M| 0 2048B|0.04 0.01 0|17-11 15:07:53
0 0 100 0 0| 235M 1354M 80.3M 2065M| 0 0 |0.04 0.01 0|17-11 15:07:55
root@ubuntu1:/home/ansible/logs# cat iostat.log
Linux 5.15.0-25-generic (wnwls648-228123) 2023년 11월 17일 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.27 0.00 0.17 0.06 0.02 99.48
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
loop0 0.00 0.02 0.00 0.00 5381 0 0
loop1 0.00 0.00 0.00 0.00 1229 0 0
loop2 0.00 0.02 0.00 0.00 4350 0 0
loop3 0.00 0.01 0.00 0.00 1777 0 0
loop4 0.00 0.02 0.00 0.00 5695 0 0
loop5 0.00 0.10 0.00 0.00 25397 0 0
loop6 0.00 0.02 0.00 0.00 4244 0 0
vda 2.75 2.35 28.23 0.00 597512 7170013 0
=====================
Linux 5.15.0-25-generic (wnwls648-228123) 2023년 11월 17일 _x86_64_ (2 CPU)
2023년 11월 17일 15시 07분 56초
avg-cpu: %user %nice %system %iowait %steal %idle
0.27 0.00 0.17 0.06 0.02 99.48
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
vda 2.75 2.35 28.23 0.00 597512 7170113 0
loop0 0.00 0.02 0.00 0.00 5381 0 0
loop1 0.00 0.00 0.00 0.00 1229 0 0
loop2 0.00 0.02 0.00 0.00 4350 0 0
loop3 0.00 0.01 0.00 0.00 1777 0 0
loop4 0.00 0.02 0.00 0.00 5695 0 0
loop5 0.00 0.10 0.00 0.00 25397 0 0
loop6 0.00 0.02 0.00 0.00 4244 0 0
loop7 0.00 0.00 0.00 0.00 0 0 0
vda1 2.74 2.16 28.18 0.00 548060 7157472 0
vda14 0.00 0.02 0.00 0.00 4370 0 0
vda15 0.00 0.05 0.05 0.00 12399 12589 0
root@ubuntu1:/home/ansible/logs# cat vmstat.log
procs ———–memory———- —swap– —–io—- -system– ——cpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1386312 82232 2312416 0 0 1 14 15 18 0 0 99 0 0
=====================
disk- ————reads———— ————writes———– —–IO—— —–timestamp—–
total merged sectors ms total merged sectors ms cur sec KST
loop0 271 0 10762 89 0 0 0 0 0 0 2023-11-17 15:07:58
loop1 70 0 2458 52 0 0 0 0 0 0 2023-11-17 15:07:58
loop2 107 0 8700 128 0 0 0 0 0 0 2023-11-17 15:07:58
loop3 84 0 3554 44 0 0 0 0 0 0 2023-11-17 15:07:58
loop4 315 0 11390 28 0 0 0 0 0 0 2023-11-17 15:07:58
loop5 653 0 50794 78 0 0 0 0 0 2 2023-11-17 15:07:58
loop6 120 0 8488 4 0 0 0 0 0 0 2023-11-17 15:07:58
loop7 0 0 0 0 0 0 0 0 0 0 2023-11-17 15:07:58
vda 19543 15304 1195265 21083 678665 251207 14340227 1484069 0 542 2023-11-17 15:07:58
=====================
9 disks
3 partitions
21163 total reads
15304 merged reads
1291411 read sectors
21506 milli reading
678665 writes
251207 merged writes
14340227 written sectors
1484069 milli writing
0 inprogress IO
544 milli spent IO
이번 글에서는 앤서블을 사용하여 CPU, 메모리, 디스크 사용률을 좀 더 자세하게 살펴볼 수 있는 dstat, iostat, vmstat과 같은 명령어를 이용해 관리 노드의 CPU, 메모리, 디스크 사용률을 모니터링 해보았습니다.
앤서블을 이용해보니, 자동화의 중요성을 깨닫게 되었고, 앤서블을 더 많이 공부하여 실제 업무에 적용하도록 더욱 더 많이 공부하도록 하겠습니다.
긴 글 읽어주셔서 감사합니다.
[참조 URL]
앤서블 관련 책정보
https://search.shopping.naver.com/book/catalog/42799514639?cat_id=50010921&frm=PBOKPRO&query=%EC%95%A4%EC%84%9C%EB%B8%94%EB%A1%9C+%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94+%EC%9D%B8%ED%94%84%EB%9D%BC+%EC%9E%90%EB%8F%99%ED%99%94&NaPm=ct%3Dloxys3pc%7Cci%3D1f44de59e2d03b99514cdf2bdfdc8b45b3a9dc39%7Ctr%3Dboknx%7Csn%3D95694%7Chk%3Dc440fee92293fe75d808ec6937966ca13ea94d95