Devops/Ansible

[Ansible] 앤서블(Ansible) 실습 - Role 구조화, 템플릿 처리, 태그, 조건문, 보안 vault 처리, 핸들러, 로깅과 디버깅

일요일좋아하는사람 2025. 4. 19. 22:41
728x90
반응형

앤서블(Ansible)

들어가며

Ansible의 개념과 플레이북 기본 사용법을 익혔다면, 이제는 실제 운영 환경에서 쓰이는 기본 구조화 기법확장 가능한 플레이북 관리 방법, 그리고 시스템 구성 관리 자동화를 배워야 할 시기입니다.

이 문서에서는 중급 수준의 DevOps 업무에 바로 적용할 수 있는 기능과 예제들을 포함하여 Ansible을 더 효과적으로 사용하도록 돕습니다. Role 구조화, 템플릿 처리, 태그, 조건문, 보안 vault 처리, 핸들러, 로깅과 디버깅 등 실무 기술을 중심으로 다룹니다.


목차

  1. Ansible Role 구조화 기본
  2. 템플릿과 Jinja2 필터 활용
  3. 핸들러를 통한 변경 트리거 처리
  4. 조건문 (when)과 반복문 (loop) 활용법
  5. 태그(tag)로 플레이북 조건 실행 구성
  6. 변수 파일과 인벤토리 그룹 구조
  7. 시크릿 파일 암호화 (ansible-vault)
  8. 파일, 디렉토리, 퍼미션 관리 자동화
  9. 디버깅과 로깅 방법 정리
  10. 중급 실전 예제 종합: 웹+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)를 연동해 배포하는 실습을 진행합니다.

 

728x90
반응형