🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Ansible 자동화 고급 패턴 완벽 가이드 - 슬라이드 1/13
A

AI Generated

2025. 10. 30. · 14 Views

Ansible 자동화 고급 패턴 완벽 가이드

Ansible을 활용한 인프라 자동화의 고급 패턴과 베스트 프랙티스를 다룹니다. 역할(Role) 구조화, 동적 인벤토리, Vault 암호화, 그리고 재사용 가능한 플레이북 작성 방법을 실전 예제로 학습합니다.


카테고리:Python
언어:Python
메인 태그:#Ansible
서브 태그:
#Playbook#Role#Vault#Inventory

들어가며

이 글에서는 Ansible 자동화 고급 패턴 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. Role_기반_구조화
  2. 동적_인벤토리_생성
  3. Ansible_Vault_암호화
  4. Jinja2_템플릿_활용
  5. Handler와_Notify_패턴
  6. 조건부_실행과_반복문
  7. Block과_에러_처리
  8. 팩트_캐싱_최적화
  9. 커스텀_모듈_작성
  10. Delegation과_Local_Action
  11. 변수_우선순위_활용
  12. 비동기_실행과_Polling

1. Role 기반 구조화

개요

Role을 사용하여 재사용 가능한 작업 단위로 플레이북을 구조화합니다. tasks, handlers, templates, files를 논리적으로 분리하여 유지보수성을 높입니다.

코드 예제

---
- hosts: webservers
  roles:
    - { role: nginx, nginx_port: 8080 }
    - { role: ssl, when: enable_ssl }
  tasks:
    - name: Custom task after roles
      debug:
        msg: "Roles executed successfully"

설명

Role을 통해 nginx와 ssl 설정을 모듈화하고, 조건부 실행과 변수 전달로 유연한 배포를 구현합니다. Role 실행 후 추가 작업도 정의할 수 있습니다.


2. 동적 인벤토리 생성

개요

정적 호스트 파일 대신 스크립트로 동적 인벤토리를 생성합니다. 클라우드 환경에서 자동으로 호스트 목록을 가져와 관리 효율을 높입니다.

코드 예제

#!/usr/bin/env python3
import json

inventory = {
    'webservers': {
        'hosts': ['web1.example.com', 'web2.example.com'],
        'vars': {'http_port': 80}
    },
    '_meta': {'hostvars': {}}
}
print(json.dumps(inventory))

설명

실행 시 JSON 형식으로 인벤토리를 출력하는 스크립트입니다. AWS, Azure 등의 API를 연동하여 실시간으로 서버 목록을 생성할 수 있습니다.


3. Ansible Vault 암호화

개요

민감한 정보(비밀번호, API 키)를 Vault로 암호화하여 안전하게 관리합니다. 암호화된 변수 파일을 버전 관리 시스템에 안전하게 저장할 수 있습니다.

코드 예제

---
# vars/secrets.yml (encrypted)
db_password: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  3037...encrypted_content...

# playbook.yml
- hosts: db
  vars_files:
    - vars/secrets.yml

설명

ansible-vault로 암호화된 변수를 플레이북에서 사용합니다. 실행 시 --ask-vault-pass 옵션으로 복호화 비밀번호를 입력하여 안전하게 접근합니다.


4. Jinja2 템플릿 활용

개요

Jinja2 템플릿으로 설정 파일을 동적으로 생성합니다. 환경별로 다른 설정을 하나의 템플릿으로 관리하여 중복을 제거합니다.

코드 예제

# templates/nginx.conf.j2
server {
    listen {{ nginx_port }};
    server_name {{ inventory_hostname }};
    {% for location in nginx_locations %}
    location {{ location.path }} {
        proxy_pass {{ location.backend }};
    }
    {% endfor %}
}

설명

변수와 반복문을 사용해 호스트별로 맞춤형 nginx 설정을 생성합니다. inventory_hostname으로 각 서버의 이름을 자동으로 삽입합니다.


5. Handler와 Notify 패턴

개요

설정 변경 시에만 서비스를 재시작하도록 Handler를 사용합니다. notify로 Handler를 트리거하여 불필요한 재시작을 방지합니다.

코드 예제

---
- name: Update nginx config
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: restart nginx

handlers:
  - name: restart nginx
    service:
      name: nginx
      state: restarted

설명

설정 파일이 실제로 변경되었을 때만 nginx를 재시작합니다. 여러 작업에서 notify해도 Handler는 플레이북 마지막에 한 번만 실행됩니다.


6. 조건부 실행과 반복문

개요

when 조건과 loop를 결합하여 복잡한 배포 로직을 구현합니다. 호스트 그룹, OS 타입, 변수 값에 따라 작업을 선택적으로 실행합니다.

코드 예제

---
- name: Install packages
  apt:
    name: "{{ item }}"
    state: present
  loop: "{{ packages }}"
  when: ansible_os_family == "Debian"

- name: Configure firewall
  firewalld:
    port: "{{ item }}/tcp"
    state: enabled
  loop: [80, 443]
  when: inventory_hostname in groups['webservers']

설명

OS가 Debian 계열일 때만 패키지를 설치하고, webservers 그룹에 속한 호스트에만 방화벽을 설정합니다. loop로 여러 항목을 효율적으로 처리합니다.


7. Block과 에러 처리

개요

block으로 작업을 그룹화하고 rescue로 에러를 처리합니다. always 섹션으로 성공/실패와 관계없이 실행할 작업을 정의합니다.

코드 예제

---
- block:
    - name: Deploy application
      copy:
        src: app.jar
        dest: /opt/app/
    - name: Start service
      service:
        name: myapp
        state: started
  rescue:
    - name: Rollback on failure
      command: /opt/scripts/rollback.sh
  always:
    - name: Send notification
      slack:
        msg: "Deployment completed"

설명

배포 중 에러 발생 시 rescue 블록으로 롤백을 수행하고, always 블록으로 항상 알림을 보냅니다. 트랜잭션과 유사한 패턴을 구현합니다.


8. 팩트 캐싱 최적화

개요

팩트 수집을 캐싱하여 반복 실행 시 성능을 대폭 향상시킵니다. Redis나 JSON 파일로 팩트를 저장하여 재사용합니다.

코드 예제

# ansible.cfg
[defaults]
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts
fact_caching_timeout = 3600

# playbook.yml
- hosts: all
  gather_facts: yes
  tasks:
    - debug: var=ansible_distribution

설명

smart gathering으로 필요할 때만 팩트를 수집하고, 1시간 동안 캐시를 유지합니다. 대규모 인프라에서 실행 시간을 크게 단축할 수 있습니다.


9. 커스텀 모듈 작성

개요

내장 모듈로 해결할 수 없는 작업을 위해 Python으로 커스텀 모듈을 작성합니다. AnsibleModule 클래스로 멱등성을 보장하는 모듈을 구현합니다.

코드 예제

#!/usr/bin/python
from ansible.module_utils.basic import AnsibleModule

def main():
    module = AnsibleModule(
        argument_spec=dict(
            name=dict(required=True, type='str'),
            state=dict(default='present', choices=['present', 'absent'])
        )
    )

    changed = False
    # Custom logic here

    module.exit_json(changed=changed, msg="Success")

if __name__ == '__main__':
    main()

설명

AnsibleModule로 입력 파라미터를 검증하고 changed 상태를 반환하는 표준 모듈 구조입니다. library/ 디렉토리에 배치하면 플레이북에서 바로 사용할 수 있습니다.


10. Delegation과 Local Action

개요

특정 작업을 다른 호스트나 로컬에서 실행합니다. 데이터베이스 백업, 로드밸런서 제어 등 중앙 집중식 작업에 활용합니다.

코드 예제

---
- name: Create backup on control node
  local_action:
    module: command
    cmd: pg_dump -h {{ inventory_hostname }} mydb > backup.sql

- name: Update load balancer
  command: /usr/bin/update_lb {{ inventory_hostname }}
  delegate_to: lb-server.example.com
  run_once: true

설명

local_action으로 컨트롤 노드에서 백업을 생성하고, delegate_to로 로드밸런서 서버에서 명령을 실행합니다. run_once로 중복 실행을 방지합니다.


11. 변수 우선순위 활용

개요

Ansible의 22단계 변수 우선순위를 이해하고 활용합니다. extra-vars, host_vars, group_vars를 전략적으로 배치하여 유연한 설정 관리를 구현합니다.

코드 예제

# group_vars/production.yml
app_env: production
db_host: prod-db.example.com

# host_vars/web1.yml
app_port: 8080

# playbook.yml
- hosts: production
  tasks:
    - debug:
        msg: "{{ app_env }} on port {{ app_port }}"

설명

group_vars로 그룹 공통 설정을, host_vars로 호스트별 설정을 정의합니다. 실행 시 --extra-vars로 최우선 변수를 주입하여 긴급 변경을 수행할 수 있습니다.


12. 비동기 실행과 Polling

개요

장시간 실행되는 작업을 비동기로 처리하고 상태를 폴링합니다. 여러 호스트에서 동시에 긴 작업을 실행하여 전체 실행 시간을 단축합니다.

코드 예제

---
- name: Run long deployment
  command: /opt/scripts/deploy.sh
  async: 3600
  poll: 0
  register: deploy_job

- name: Check deployment status
  async_status:
    jid: "{{ deploy_job.ansible_job_id }}"
  register: job_result
  until: job_result.finished
  retries: 120
  delay: 30

설명

async로 최대 1시간의 비동기 실행을 설정하고, poll: 0으로 즉시 다음 작업으로 진행합니다. async_status로 30초마다 상태를 확인하며 완료를 대기합니다.


마치며

이번 글에서는 Ansible 자동화 고급 패턴 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#Ansible #Playbook #Role #Vault #Inventory

#Ansible#Playbook#Role#Vault#Inventory#Python

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.