2 분 소요

수십 대의 서버에 동일한 설정을 적용해야 할 때 일일이 접속해서 작업하는 것은 비효율적이고 실수하기 쉽습니다. Ansible은 에이전트 없이 SSH만으로 동작하는 간단하고 강력한 자동화 도구입니다.

서버 하드웨어 이미지

Ansible로 일괄 관리되는 서버 인프라

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 [email protected]
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]

# 접속 테스트
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

코드 화면 이미지

Ansible 플레이북 작성 화면

변수와 템플릿

# 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 인프라를 그대로 활용할 수 있어 서버 자동화를 처음 시작하기에 적합한 도구입니다. 작은 태스크부터 시작해 점차 플레이북과 롤을 구조화해 나가는 것이 좋습니다.

댓글남기기