들어가며
Ansible의 개념과 플레이북 기본 사용법을 익혔다면, 이제는 실제 운영 환경에서 쓰이는 기본 구조화 기법과 확장 가능한 플레이북 관리 방법, 그리고 시스템 구성 관리 자동화를 배워야 할 시기입니다.
이 문서에서는 중급 수준의 DevOps 업무에 바로 적용할 수 있는 기능과 예제들을 포함하여 Ansible을 더 효과적으로 사용하도록 돕습니다. Role 구조화, 템플릿 처리, 태그, 조건문, 보안 vault 처리, 핸들러, 로깅과 디버깅 등 실무 기술을 중심으로 다룹니다.
목차
- Ansible Role 구조화 기본
- 템플릿과 Jinja2 필터 활용
- 핸들러를 통한 변경 트리거 처리
- 조건문 (when)과 반복문 (loop) 활용법
- 태그(tag)로 플레이북 조건 실행 구성
- 변수 파일과 인벤토리 그룹 구조
- 시크릿 파일 암호화 (ansible-vault)
- 파일, 디렉토리, 퍼미션 관리 자동화
- 디버깅과 로깅 방법 정리
- 중급 실전 예제 종합: 웹+DB 배포 구조
1. Ansible Role 구조화 기본
Role은 플레이북을 논리적 단위로 나누어 관리하는 강력한 구조화 기능입니다. 각 역할은 tasks, handlers, templates, files, vars, defaults 등을 포함할 수 있습니다.
ansible-galaxy init roles/webserver
디렉토리 구조:
roles/webserver/
├── tasks/main.yml
├── handlers/main.yml
├── templates/nginx.conf.j2
├── files/index.html
├── defaults/main.yml
├── vars/main.yml
└── meta/main.yml
예제: 웹서버 설치 Role
# roles/webserver/tasks/main.yml
- name: NGINX 설치
apt:
name: nginx
state: present
- name: index.html 복사
copy:
src: index.html
dest: /var/www/html/index.html
- name: nginx.conf 템플릿 적용
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx
2. 템플릿과 Jinja2 필터 활용
템플릿은 .j2 확장자를 가진 Jinja2 기반의 텍스트 파일로, 설정 파일을 변수 기반으로 생성할 수 있습니다.
예제: nginx.conf.j2 템플릿
server {
listen 80;
server_name {{ ansible_fqdn }};
location / {
root /var/www/html;
index index.html;
}
}
템플릿 내에서는 {{ variable | default('값') }} 과 같은 필터 사용도 가능합니다.
3. 핸들러를 통한 변경 트리거 처리
핸들러는 notify된 작업이 변경되었을 때만 실행됩니다. 재시작이 필요한 서비스 설정 시 매우 유용합니다.
예제: handlers/main.yml
- name: restart nginx
service:
name: nginx
state: restarted
tasks에서 템플릿 변경 시 핸들러를 호출:
notify: restart nginx
4. 조건문 (when)과 반복문 (loop) 활용법
조건문 예시:
- name: CentOS 전용 작업
yum:
name: httpd
state: present
when: ansible_os_family == 'RedHat'
반복문 예시:
- name: 여러 유틸 설치
apt:
name: "{{ item }}"
state: present
loop:
- curl
- unzip
- git
5. 태그(tag)로 플레이북 조건 실행 구성
태그는 선택적으로 작업을 실행하고자 할 때 유용합니다.
- name: 사용자 생성
user:
name: deploy
state: present
tags:
- user
- name: SSH key 배포
authorized_key:
user: deploy
key: "{{ lookup('file', 'id_rsa.pub') }}"
tags:
- ssh
실행:
ansible-playbook playbook.yml --tags user
6. 변수 파일과 인벤토리 그룹 구조
group_vars/webservers.yml
nginx_port: 80
app_env: production
host_vars/app01.yml
app_name: myapp
이를 통해 서버 그룹별, 개별 서버별로 유연한 변수 관리를 할 수 있습니다.
7. 시크릿 파일 암호화 (ansible-vault)
Ansible은 민감한 정보를 암호화하기 위해 Vault 기능을 제공합니다.
ansible-vault encrypt vault/secrets.yml
예제: 암호화된 변수 파일
mysql_password: supersecret123
플레이북 실행 시:
ansible-playbook playbook.yml --ask-vault-pass
8. 파일, 디렉토리, 퍼미션 관리 자동화
- name: 로그 디렉토리 생성
file:
path: /var/log/myapp
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: 설정 파일 복사
copy:
src: myapp.conf
dest: /etc/myapp/config.ini
owner: root
group: root
mode: '0644'
9. 디버깅과 로깅 방법 정리
- name: debug 예제
debug:
msg: "현재 배포 환경은 {{ app_env }} 입니다."
- name: 변수 출력
debug:
var: ansible_hostname
플레이북 실행 시 상세 로그 확인:
ansible-playbook site.yml -vvv
10. 중급 실전 예제 종합: 웹+DB 배포 구조
디렉토리 구조:
site.yml
inventory/
hosts
roles/
webserver/
database/
vars/
global.yml
vault/
secrets.yml (vault encrypted)
site.yml 예시:
- hosts: webservers
roles:
- role: webserver
- hosts: dbservers
roles:
- role: database
이 구조를 기반으로 웹 서버(NGINX) + DB 서버(MariaDB/PostgreSQL)를 연동해 배포하는 실습을 진행합니다.