개요
매번 반복되는 서버 설정, 여러 대의 서버에 동일한 작업을 하다가 발생하는 실수 때문에 지쳐본 적 없으신가요?
Ansible은 그런 고민을 해결해 줄 아주 강력한 도구입니다!
이번 게시글에서는 앤서블의 핵심 개념을 이해하고 직접 내 손으로 첫 자동화를 실행하는 것까지 함께 해보겠습니다.
1교시: 앤서블, 도대체 뭔가요?
이전 게시글에서 앤서블이 무엇인지 아주 자세하게 설명하였습니다!
위 게시글을 읽고 오시면 도움이 되실거에요!
앤서블이란 간단히 말해 여러 대의 컴퓨터(서버)에 특정 작업을 대신 실행해주는 비서 같은 프로그램입니다.
이 똑똑한 비서는 다음과 같은 특징을 가지고 있어요!
에이전트가 필요 없어요 (Agentless)
다른 도구들처럼 관리할 서버에 일일이 무언가를 설치할 필요가 없습니다!
우리가 원래 서버에 접속할 때 쓰는 SSH 통신 방식을 그대로 사용하거든요.
그래서 도입이 아주 쉽고 가볍습니다!
사람 친화적인 언어 (YAML)
복잡한 프로그래밍 언어가 아닌, 사람이 읽고 쓰기 쉬운 YAML 형식으로 작업 지시서(플레이북)을 작성해요.
아래에서 보게 될 텐데, 진짜 너무 간단합니다.
꼭 알아야 할 핵심 용어!
앤서블 세계에서는 몇 가지 용어를 사용합니다. 비유를 통해 쉽게 이해해볼까요?
용어 | 비유 (내가 사령관이라면?) | 설명 |
---|---|---|
제어 노드 (Control Node) | 사령관 (나) | 앤서블이 설치되어 명령을 내리는 내 컴퓨터(서버) |
관리 노드 (Managed Node) | 병사들 | 내가 관리할 여러 대의 원격 서버들 |
인벤토리 (Inventory) | 병사 명단 | 어떤 병사들(서버)을 관리할지 적어놓은 목록 파일 |
모듈 (Module) | 명령어 종류 | '소프트웨어 설치해!', '파일 복사해!' 등 실제 작업을 수행하는 부품/명령어 |
애드훅 (Ad-hoc) | 일회성 구두 명령 | 플레이북 없이, 터미널에서 즉시 실행하는 간단한 단발성 명령 |
플레이북 (Playbook) | 작전 계획서 | '1. A 서버에 웹 서버 설치' '2. B 서버에 DB 설치' 처럼 작업 순서를 기록한 시나리오 파일 |
2교시: 실습 준비! 나만의 앤서블 훈련장 만들기
백문이 불여일견! 직접 앤서블을 다뤄보기 위한 우리만의 실습 환경을 만들어 봅시다!
- 인벤토리(Inventory), 플레이북(Playbook), 제어문(반복문/조건문), 변수, Role 등과 관련된 앤서블 구조는 다음 게시글을 참고하시고 아래 실습을 진행하시면 더욱 효과적입니다!
- 앤서블 기본 구조 익히기
오늘의 실습 시나리오
상황
당신은 신입 시스템 엔지니어입니다. 선임 개발자로부터 "새로 구성한 웹 서버 2대(web1
, web2
)의 연결을 확인하고,
웹 서비스를 위해 nginx
를 설치해주세요." 라는 요청을 받았습니다.
목표
- 1. 내 컴퓨터(제어 노드)에서 웹 서버 2대(관리 노드)로 정상 접속이 되는지 테스트한다.
- 2. 앤서블 플레이북을 이용하여 웹 서버 2대에 nginx를 한 번에 설치하고 실행한다.
훈련장 구축 단계
1. 가상머신 준비: 실습을 위해 최소 3대의 리눅스 서버가 필요합니다!
- 제어 노드 (1대):
control-plane
- 관리 노드 (2대):
web1
,web2
2. 앤서블 설치 (제어 노드에서만!)
제어 노드 터미널에서 아래 명령어로 앤서블을 설치해주세요!
# CentOS/RHEL 계열
sudo yum install -y ansible
# Ubuntu/Debian 계열
sudo apt update
sudo apt install -y ansible
3. SSH 키 설정 (가장 중요!)
제어 노드가 관리 노드에 비밀번호 없이 접속하려면 "열쇠"가 필요합니다.
제어 노드에서 열쇠(SSH Key
)를 만들어 web1
, web2
에 복사해주세요.
# 1. 제어 노드에서 키 생성 (엔터만 계속 누르세요)
ssh-keygen
# 2. web1 서버에 내 공개키 복사 (web1의 비밀번호를 물어볼 겁니다)
ssh-copy-id [web1_서버_계정]@[web1_서버_IP]
# 3. web2 서버에 내 공개키 복사 (web2의 비밀번호를 물어볼 겁니다)
ssh-copy-id [web2_서버_계정]@[web2_서버_IP]
4. 인벤토리 (서버 목록) 작성
제어 노드에서 관리할 서버 목록 파일을 만듭니다.
앤서블은 기본적으로 /etc/ansible/hosts
파일을 읽어요. 이 파일을 수정해줍시다.
sudo vi /etc/ansible/hosts
파일을 열고 아래 내용을 추가해주세요. webservers
라는 그룹을 만들고, 그 안에 web1
과 web2
의 IP 주소를 적어주는 겁니다.
[webservers]
192.168.56.101 # web1의 IP 주소로 변경하세요
192.168.56.102 # web2의 IP 주소로 변경하세요
자, 이제 모든 준비가 끝났습니다! 본격적으로 앤서블을 사용해볼까요?
3교시: 첫 번째 임무! 애드훅 명령어로 서버와 대화하기
먼저 간단한 일회성 명령(Ad-hoc) 으로 서버들이 우리 말을 잘 듣는지 확인해봅시다.
실습: 모든 서버에 핑 테스트
제어 노드 터미널에서 아래 명령어를 입력해보세요.
ansible all -m ping
ansible
: 앤서블 실행!all
: 인벤토리에 있는 모든 서버에게! (webservers 라고 그룹명을 써도 됩니다)-m ping
: ping 모듈을 사용해서! (ping은 연결 상태를 점검하는 모듈입니다)
결과 확인
성공했다면, 각 서버로부터 초록색 글씨로 응답이 올겁니다.
192.168.56.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.56.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
서바가 pong
하고 대답을 돌려줬죠? SUCCESS
메시지는 제어 노드와 관리 노드 간의 통신이 완벽하게 이루어졌다는 뜻입니다.
4교시: 진짜 자동화! 플레이북 작성 및 실행
이제 우리의 최종 목표인 nginx 설치 자동화 를 위한 '작전 계획서(Playbook)'을 작성해 보겠습니다.
실습: nginx 설치 및 실행 플레이북 만들기
제어 노드에서 nginx_install.yml
이라는 파일을 만들어 아래 내용과 똑같이 작성해주세요.
띄어쓰기에 민감하니 복사-붙여넣기를 추천합니다!
---
- name: Install and run Nginx web server
hosts: webservers
become: yes
tasks:
- name: Install Nginx package
ansible.builtin.yum:
name: nginx
state: present
- name: Start and enable Nginx service
ansible.builtin.service:
name: nginx
state: started
enabled: yes
hosts: webservers
: 이 작전은 webservers 그룹에 해당하는 서버들을 대상으로 합니다.become: yes
: 작업을 실행할 때 sudo처럼 관리자 권한을 획득합니다. (패키지 설치에 필요)tasks:
: 실제 수행할 작업 목록입니다.- 첫 번째 Task: yum 모듈(CentOS 기준)을 사용해 nginx 패키지를 present(존재하는 상태, 즉 설치된 상태)로 만듭니다.
- 두 번째 Task: service 모듈을 사용해 nginx 서비스를 started(시작된 상태)로 만들고, 부팅 시에도 자동 실행(enabled: yes)되도록 합니다.
를레이북 실행 및 결과 확인
이제 작전 계획서를 실행할 시간입니다!
ansible-playbook nginx_install.yml
명령을 내리면 앤서블이 플레이북에 적힌 순서대로 web1과 web2에 접속하여 Nginx를 설치하고 실행합니다. 실행 결과가 아래와 같이 나타날 겁니다.
PLAY [Install and run Nginx web server] **************************************
TASK [Gathering Facts] *******************************************************
ok: [192.168.56.101]
ok: [192.168.56.102]
TASK [Install Nginx package] *************************************************
changed: [192.168.56.101]
changed: [192.168.56.102]
TASK [Start and enable Nginx service] ****************************************
changed: [192.168.56.101]
changed: [192.168.56.102]
PLAY RECAP *******************************************************************
192.168.56.101 : ok=4 changed=2 unreachable=0 failed=0
192.168.56.102 : ok=4 changed=2 unreachable=0 failed=0
PLAY RECAP
에서 changed=2
와 failed=0
이 보이나요?
두 서버에 2개의 변화가 성공적으로 적용되었고, 실패는 없었다는 의미입니다.
최종 테스트: 정말 설치되었을까?
웹 브라우저를 열고 관리 노드들의 IP 주소(http://192.168.56.101
, http://192.168.56.102
)로 접속해보세요!
마무리
1단계 임무 완수!
오늘은 앤서블의 가장 기본적인 개념을 배우고,
직접 서버 환경을 구성하여 연결 테스트와 간단한 프로그램 설치 자동화까지 진행해 보았습니다.
우리는 오늘!
- 제어 노드, 관리 노드, 인벤토리, 플레이북의 개념을 이해했습니다.
- SSH 키로 서버 간 자동 접속 환경을 구축했습니다.
ansible all -m ping
명령으로 서버 연결을 확인했습니다.- Nginx를 설치하는 간단한 플레이북을 작성하고 실행했습니다.
수동으로 했다면 각 서버에 두 번씩 접속해서 여러 개의 명령어를 쳐야 했을 작업을,
단 하나의 파일과 한 줄의 명령어로 끝냈습니다. 이것이 바로 앤서블의 힘입니다.