[NBP 기술&경험] 대규모 서비스 운영을 위한 Ansible 활용 방안

NAVER Cloud
NAVER Cloud
Published in
7 min readJan 13, 2020

안녕하세요, 네이버 클라우드 플랫폼입니다.

이번 시간에는 대규모 서비스 운영을 위한 ‘Ansible 활용 방안’ 에 대해 간단히 알려드리겠습니다.

Ansible은 프로비저닝(Provisioning), 오케스트레이션(Orchestration) 등의 작업을 위한 IT 인프라 자동화 관리 도구입니다. YAML 형식을 기반으로 플레이북(Playbook)을 실행시켜서 기술 진입 장벽이 낮은 편입니다.

Why Ansible?

첫 번째, Node에 별도의 설치 및 설정이 불필요합니다. ssh public key 등록까지만 진행하면, 이후 모든 작업은 ansible로 가능합니다.

두 번째, 하나의 Playbook*으로 대량 작업을 하기가 용이합니다. 즉, 작업 성격에 따라 병렬 수행 및 동기/ 비동기 작업 구분이 가능합니다. 시스템 리소스 alert를 발생시키거나(비동기 수행) 펌웨어 업데이트 및 적용(동기 수행)이 가능해집니다.

Playbook* : Ansible의 설정, 배포, 통합 언어

간단한 Ansible 사용법

1. 중앙 서버에 Ansible을 설치하고, node에 ssh private key를 배포합니다.

Yum –y install ansible

▶ ssh-keygen 으로 key pair 생성

▶ .ssh/id_rsa.pub 을 node 의 .ssh/authorized_keys 로 복사

2. /etc/ansible/hosts 파일에 작업 대상 Node를 등록합니다.

그룹 단위로 구분하여 등록이 가능합니다

[webserver] 
192.168.0.1
192.168.0.2
[Database]
192.168.10.1
192.168.10.2

3. node에 실행할 Playbook을 작성합니다.

예시)

[root@localhost]# cat test.yml 
---
- hosts: ‘{{ hosts }}’
any_errors_fatal: true
gather_facts: no
serial: ‘{{ parallel }}’
tasks:
— include_tasks: inner_task.yml
[root@localhost]# cat inner_task.yml
---
- name: known host regist
connection: local
shell: “ssh-keyscan -H {{ inventory_hostname }} >>/root/.ssh/known_hosts;”
- name: check
shell: “/usr/bin/w”
register: output
- debug: var=output.stdout

4. 등록한 node에 작성한 Playbook을 이용하여 명령을 수행합니다

[root@localhost]# /usr/bin/ansible-playbook ./test.yml -e hosts=webserver

결과)

PLAY [webserver]****************************************************TASK [include_tasks] ***********************************************
included: /root/nap/inner_task.yml for 192.168.0.1 192.168.0.2
TASK [known host regist]********************************************
changed: [192.168.0.1]
changed: [192.168.0.2]
TASK [check]********************************************************
changed: [192.168.0.1]
changed: [192.168.0.2]
TASK [debug]********************************************************
ok: [192.168.0.1] => {
“output.stdout”: “ 15:20:32 up 152 days, 3:03, 2 users, load average: 0.31, 0.21, 0.24\nUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT\nroot pts/0 10Jul19 45:55m 2.36s 2.36s -bash\nroot pts/73 10.101.244.70 15:20 1.00s 0.17s 0.03s /usr/bin/w”
}
ok: [192.168.0.2] => { “output.stdout”: “ 15:20:32 up 152 days, 3:03, 2 users, load average: 0.17, 0.19, 0.26\nUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT\nroot pts/0 05Jun19 19:16m 3.96s 3.96s -bash\nroot pts/44 10.101.244.70 15:20 1.00s 0.17s 0.04s /usr/bin/w” }

​Ansible 활용 방안

시스템 리소스 탐지 (모니터링)

Agentless 방식으로 Node의 리소스 가용량을 탐지할 수 있습니다.

▶ 시스템 리소스 탐지 시, 실행할 스크립트를 배포합니다.

- Sar –n EDEV 1 1 등으로, 네트워크 패킷 Loss 탐지

- File system 상태 탐지 (touch /;echo $? 등의 방법)

- Load average 탐지

▶ Ansible playbook을 일정 주기로 실행하며 탐지합니다.

- 병렬 / 비동기 수행 등으로 보다 짧은 주기의 탐지 가능

Rolling 업데이트

▶ 실제 서비스에 투입되어 있는 서버의 경우, 일괄 작업이 매우 어렵습니다. 전체 100대의 서버에 순차적으로 업데이트를 수행해야 한다면, 100번의 작업이 필요한 셈입니다. 롤링 업데이트가 되지 않는다면, 아래의 과정을 거쳐야 합니다.

1) 서비스 제외

-Servixe daemon stop / Process kill / I/F down 등

2) 업데이트 후 적용(리부팅 등)

- H/W Firmware update / Kernel update 등

3) 서비스 재투입

-Daemon restart / Process re execute / I/F up 등

4) 서비스 정상 투입 확인

▶ Ansible playbook을 이용하면, 위와 같은 작업을 자동화할 수 있습니다.

글을 마치며…

이번 포스팅에서는 시스템 리소스를 탐지하며 빠른 provision이 가능한 IT 인프라 관리 도구, Rolling 업데이트가 가능하면서도 자동 배포 환경이 쉬운 ‘Ansible’을 알아보았습니다.

​앞으로도 더욱 유익하고 다양한 콘텐츠로 찾아뵙겠습니다. 감사합니다.

--

--

NAVER Cloud
NAVER Cloud

We provide cloud-based information technology services for industry leaders from startups to enterprises.