Ansible로 시작하는 서버 자동화 입문
수십 대의 서버에 동일한 설정을 적용해야 할 때 일일이 접속해서 작업하는 것은 비효율적이고 실수하기 쉽습니다. Ansible은 에이전트 없이 SSH만으로 동작하는 간단하고 강력한 자동화 도구입니다.
Ansible 설치
컨트롤 노드(관리 서버)에 설치
# RHEL/Rocky Linux
dnf install ansible -y
# Ubuntu/Debian
apt update && apt install ansible -y
# pip로 최신 버전 설치
pip3 install ansible
# 설치 확인
ansible --version
인벤토리(Inventory) 설정
인벤토리는 관리할 서버 목록을 정의하는 파일입니다.
# /etc/ansible/hosts 또는 inventory.ini
# 개별 호스트
web1.example.com
192.168.1.10
# 그룹 정의
[webservers]
web1.example.com
web2.example.com
web3.example.com
[dbservers]
db1.example.com ansible_port=2222
db2.example.com
[production:children]
webservers
dbservers
# 호스트 변수
[webservers:vars]
ansible_user=deploy
ansible_python_interpreter=/usr/bin/python3
SSH 키 인증 설정
# SSH 키 생성 (이미 있으면 생략)
ssh-keygen -t ed25519 -C "ansible-key"
# 각 대상 서버에 공개키 배포
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.10
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.11
# 접속 테스트
ansible all -i inventory.ini -m ping
Ad-hoc 명령어
플레이북 없이 즉시 명령을 실행합니다.
# 모든 서버에 ping 테스트
ansible all -m ping
# 웹서버 그룹에 명령 실행
ansible webservers -m shell -a "df -h"
# 패키지 설치
ansible webservers -m dnf -a "name=nginx state=present" --become
# 서비스 재시작
ansible webservers -m service -a "name=nginx state=restarted" --become
# 파일 복사
ansible all -m copy -a "src=/local/file.conf dest=/etc/app/file.conf" --become
플레이북(Playbook) 작성
# deploy-webserver.yml
---
- name: 웹서버 설치 및 설정
hosts: webservers
become: yes
vars:
nginx_port: 80
document_root: /var/www/html
tasks:
- name: Nginx 설치
dnf:
name: nginx
state: latest
- name: Nginx 서비스 활성화 및 시작
service:
name: nginx
state: started
enabled: yes
- name: 방화벽 포트 오픈
firewalld:
port: "/tcp"
permanent: yes
state: enabled
notify: reload firewalld
- name: 인덱스 페이지 배포
template:
src: templates/index.html.j2
dest: "/index.html"
mode: '0644'
handlers:
- name: reload firewalld
service:
name: firewalld
state: reloaded
# 플레이북 실행
ansible-playbook -i inventory.ini deploy-webserver.yml
# 드라이런 (실제 변경 없이 시뮬레이션)
ansible-playbook -i inventory.ini deploy-webserver.yml --check
# 특정 태그만 실행
ansible-playbook -i inventory.ini deploy-webserver.yml --tags install
변수와 템플릿
# group_vars/webservers.yml
nginx_worker_processes: auto
nginx_worker_connections: 1024
server_name: example.com
{# templates/nginx.conf.j2 #}
worker_processes ;
events {
worker_connections ;
}
http {
server {
listen 80;
server_name ;
root /var/www/html;
}
}
롤(Role) 구조
재사용 가능한 자동화 단위를 롤로 정리합니다.
# 롤 디렉토리 구조 자동 생성
ansible-galaxy init nginx-role
# 생성된 구조:
# nginx-role/
# ├── defaults/main.yml # 기본 변수
# ├── handlers/main.yml # 핸들러
# ├── tasks/main.yml # 태스크
# ├── templates/ # 템플릿 파일
# ├── files/ # 정적 파일
# └── vars/main.yml # 변수
# playbook.yml에서 롤 사용
- name: 웹서버 구성
hosts: webservers
become: yes
roles:
- nginx-role
- php-role
- mysql-role
유용한 Ansible 명령어
# 인벤토리 확인
ansible-inventory -i inventory.ini --list
# 특정 호스트 변수 확인
ansible -i inventory.ini web1 -m setup
# 플레이북 문법 검사
ansible-playbook playbook.yml --syntax-check
# 실행할 태스크 목록 확인
ansible-playbook playbook.yml --list-tasks
# 상세 출력 모드
ansible-playbook playbook.yml -v # verbose
ansible-playbook playbook.yml -vvv # 매우 상세
Ansible은 진입 장벽이 낮고 기존 SSH 인프라를 그대로 활용할 수 있어 서버 자동화를 처음 시작하기에 적합한 도구입니다. 작은 태스크부터 시작해 점차 플레이북과 롤을 구조화해 나가는 것이 좋습니다.
댓글남기기