서버가 1~2대일 때는 직접 접속해서 apt install nginx를 입력해도 문제가 없습니다.
하지만 관리해야 할 서버가 100대가 된다면?
명령어 하나를 100번 입력해야 하고, 중간에 한 서버에서 에러가 나면 어디까지 진행되었는지 파악하기도 힘듭니다.
이러한 Configuration Management 문제를 해결하기 위해 Agent를 설치할 필요가 없어 도입이 간편한 Ansible을 선택했습니다.
Ansible의 가장 강력한 특징은 멱등성(Idempotency)입니다. "Nginx를 설치해"라고 백 번 명령해도, 이미 설치되어 있다면 아무런 변경도 가하지 않습니다. 이 덕분에 스크립트를 여러 번 실행해도 시스템 상태가 꼬이지 않고 항상 원하는 상태(Desired State)를 유지할 수 있습니다.
관리 대상 서버 목록을 hosts.ini 파일에 정의합니다. 그룹핑을 통해 웹 서버, DB 서버를 나누어 관리할 수 있습니다.
[webservers]
192.168.1.101
192.168.1.102
[dbservers]
192.168.1.201
[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa
실제 수행할 작업을 YAML 형식으로 정의합니다.
---
- name: 웹 서버 설정
hosts: webservers
become: true
tasks:
- name: Nginx 설치
apt:
name: nginx
state: present
update_cache: yes
- name: index.html 배포
copy:
src: ./index.html
dest: /var/www/html/index.html
mode: '0644'
notify: Restart Nginx
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
다음 명령어로 100대의 서버에 동시 적용합니다.
ansible-playbook -i hosts.ini site.yml
Execution Result:
PLAY [웹 서버 설정] ***************************************************************
TASK [Gathering Facts] **********************************************************
ok: [192.168.1.101]
ok: [192.168.1.102]
...
TASK [Nginx 설치] *************************************************************
changed: [192.168.1.101]
changed: [192.168.1.102]
...
PLAY RECAP **********************************************************************
192.168.1.101 : ok=3 changed=2 unreachable=0 failed=0
...
Ansible을 도입함으로써 서버 세팅 시간을 며칠에서 몇 분 단위로 단축시켰습니다. 이제 Infrastructure as Code 개념을 OS 설정 레벨까지 확장하여, 서버가 불의의 사고로 유실되더라도 언제든 똑같은 상태로 즉시 복구할 수 있는 재해 복구(DR) 체계를 갖추게 되었습니다.