들어가며
이전 문서에서 우리는 역할(Role), 템플릿, 조건문, 핸들러, 태그, 인벤토리 분리 등 Ansible의 핵심 기능을 배웠습니다. 이제는 한 단계 더 나아가 엔터프라이즈급 환경에 적용 가능한 고급 기능들을 익힐 시간입니다.
이 문서에서는 컨트롤 플레인 아키텍처 설계, 동적 인벤토리, 고급 커스텀 모듈 및 필터 플러그인 작성, 파이프라인 자동화, 멀티플레이북 조합 전략, 상태 기반 테스트 등을 다룹니다.
실습 예제와 설명으로 구성되어 있으며, 실무 환경에서의 DevOps 통합을 위한 고급 기술을 실제 플레이북, 커스텀 모듈 코드, 테스트 설정 예시 등과 함께 제공합니다.
목차
- 컨트롤 노드와 실행 전략 튜닝
- 동적 인벤토리 구성 (AWS, GCP, 쿠버네티스)
- 커스텀 모듈 및 플러그인 개발
- 커스텀 필터와 테스트 가능한 템플릿 시스템
- Ansible Collections 관리 및 내부 Registry 구성
- 멀티 플레이북 워크플로우와 DAG 설계
- CI/CD 통합 자동화 (GitHub Actions, GitLab CI, Jenkins)
- Molecule 기반 단위 테스트 및 시나리오 테스트
- 운영 환경 추적 및 감사 로그 설계
- 고급 DevSecOps와 보안 정책 적용
1. 컨트롤 노드와 실행 전략 튜닝
Ansible의 병렬성, 연결 유지, 작업 재시도 등의 설정을 통해 더 효율적인 실행 전략을 구성할 수 있습니다. 이를 통해 수십~수백 대의 서버를 안정적으로 관리하는 것이 가능합니다.
실행 전략 튜닝 설정 예시
# ansible.cfg
[defaults]
forks = 50
retry_files_enabled = true
inventory = ./inventory/hosts
[ssh_connection]
control_path = %(directory)s/%%h-%%p-%%r
pipelining = true
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
플레이북 실행 시 옵션 활용
# 재시도 파일 생성하면서 최대 3번 재시도
ansible-playbook site.yml --forks 30 --timeout 15 --retry
병렬 실행 최적화 실습
- forks=5 와 forks=50의 차이 비교
- AWS t2.micro 다수 대상에 ping 실행 후 결과 비교
2. 동적 인벤토리 구성 (AWS, GCP, 쿠버네티스)
Ansible은 정적인 hosts 파일을 넘어서 클라우드 자원, 컨테이너 오케스트레이션 플랫폼(Kubernetes 등)과 연동하여 동적으로 인벤토리를 생성할 수 있습니다. 이를 통해 최신 상태의 인프라 환경에 맞춘 자동화를 구현할 수 있습니다.
📌 2.1 AWS 동적 인벤토리 구성
pip install boto3 botocore
plugin: aws_ec2
regions:
- ap-northeast-2
keyed_groups:
- prefix: tag
key: Tags
filters:
instance-state-name: running
hostnames:
- private-ip-address
compose:
ansible_host: private_ip_address
ansible-inventory -i inventory/aws_ec2.yml --graph
ansible all -i inventory/aws_ec2.yml -m ping
📌 2.2 GCP 동적 인벤토리 구성
pip install google-auth requests pyyaml
plugin: gcp_compute
projects:
- your-gcp-project
zones:
- asia-northeast3-a
auth_kind: serviceaccount
service_account_file: inventory/credentials.json
hostnames:
- name
compose:
ansible_host: networkInterfaces[0].accessConfigs[0].natIP
ansible-inventory -i inventory/gcp_compute.yml --list
ansible all -i inventory/gcp_compute.yml -m ping
📌 2.3 Kubernetes 동적 인벤토리 구성
ansible-galaxy collection install kubernetes.core
plugin: kubernetes.core.k8s
api_key: "{{ lookup('env', 'K8S_API_TOKEN') }}"
host: https://your.k8s.api.endpoint
verify_ssl: no
namespace: default
kind: Pod
label_selectors:
- app=nginx
compose:
ansible_host: status.podIP
K8S_API_TOKEN=$(cat ~/.kube/token) ansible-inventory -i inventory/k8s_inventory.yml --list
🧪 실습 예제
- name: Check nginx installed
hosts: tag_Environment_dev
become: yes
tasks:
- name: Ensure nginx is installed
ansible.builtin.yum:
name: nginx
state: present
🧠 팁: 동적 인벤토리 캐싱
[inventory]
enable_plugins = aws_ec2, gcp_compute, kubernetes.core.k8s
[defaults]
inventory_plugins = host_list, script, auto, yaml, ini, toml
cache_plugin = jsonfile
cache_plugin_connection = .ansible_cache
cache_timeout = 3600
3. 커스텀 모듈 및 플러그인 개발
#!/usr/bin/python
from ansible.module_utils.basic import AnsibleModule
def run_module():
module_args = dict(name=dict(type='str', required=True))
result = dict(changed=False, original_message='', message='')
module = AnsibleModule(argument_spec=module_args, supports_check_mode=True)
name = module.params['name']
result['original_message'] = name
result['message'] = f"Hello, {name}!"
module.exit_json(**result)
def main():
run_module()
if __name__ == '__main__':
main()
- name: Use custom module
hosts: localhost
tasks:
- name: Say hello
hello_module:
name: DevOps 엔지니어
def to_uppercase(value):
return value.upper()
class FilterModule(object):
def filters(self):
return { 'to_uppercase': to_uppercase }
- name: Filter demo
hosts: localhost
vars:
my_string: "ansible advanced"
tasks:
- debug:
msg: "{{ my_string | to_uppercase }}"
from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase):
def v2_runner_on_ok(self, result):
host = result._host
print(f"[OK] {host.name}: {result.task_name}")
[defaults]
callback_plugins = ./callback_plugins
stdout_callback = minimal_logger
- name: Combine custom module and filter
hosts: localhost
vars:
name: "infra master"
tasks:
- name: Use custom filter
debug:
msg: "{{ name | to_uppercase }}"
- name: Use custom module
hello_module:
name: "{{ name }}"
[...중략 - 기존 1~3번 내용 유지...]
4. 커스텀 필터와 테스트 가능한 템플릿 시스템
Ansible에서는 템플릿을 Jinja2 기반으로 구성하며, 복잡한 텍스트 처리와 조건 분기에 유용합니다. 커스텀 필터를 추가하면 템플릿 안에서 사용할 수 있는 기능을 확장할 수 있습니다.
📄 예제: custom_filters.py
def obfuscate_email(value):
return value.replace("@", " [at] ")
class FilterModule(object):
def filters(self):
return {
'obfuscate_email': obfuscate_email
}
📄 예제 템플릿: index.html.j2
<h1>Welcome, {{ user_email | obfuscate_email }}</h1>
✅ 결과 예시
<h1>Welcome, devops [at] example.com</h1>
5. Ansible Collections 관리 및 내부 Registry 구성
Ansible 2.9부터는 Collection을 통해 역할, 모듈, 플러그인을 패키징할 수 있게 되었습니다. 사내 표준화된 자동화 코드를 배포할 때 유용합니다.
📁 디렉토리 구조
collections/
└── ansible_collections/
└── company/
└── webserver/
├── roles/
├── plugins/
└── docs/
📄 requirements.yml 예시
collections:
- name: community.general
- name: company.webserver
source: ./collections/ansible_collections
✅ 설치 명령
ansible-galaxy collection install -r requirements.yml
6. 멀티 플레이북 워크플로우와 DAG 설계
복잡한 환경에서는 역할 간 의존성, 순서를 고려하여 플레이북을 DAG 형태로 설계해야 합니다.
📄 예시 site.yml
- import_playbook: setup_network.yml
- import_playbook: setup_firewall.yml
- import_playbook: deploy_database.yml
- import_playbook: deploy_application.yml
📄 플레이북 예시
- hosts: database
roles:
- postgresql
tags:
- db
실행 순서 예제
ansible-playbook site.yml --tags "db"
7. CI/CD 통합 자동화 (GitHub Actions, GitLab CI, Jenkins)
Ansible은 CI/CD 시스템과 연동하여 자동화된 배포 및 테스트 흐름을 구축할 수 있습니다.
📁 GitHub Actions 워크플로우 예시
name: Deploy Infra
on:
push:
branches: [ main ]
jobs:
ansible:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: sudo apt-get install ansible -y
- name: Run Playbook
run: ansible-playbook -i inventory/aws_ec2.yml site.yml
8. Molecule 기반 단위 테스트 및 시나리오 테스트
Molecule은 역할 단위의 테스트를 위한 프레임워크입니다. Lint, syntax check, idempotency check 등을 자동으로 수행합니다.
📁 구조 예시
roles/
nginx/
molecule/
default/
molecule.yml
playbook.yml
📄 molecule.yml 예제
platforms:
- name: instance
image: docker.io/ubuntu:20.04
pre_build_image: true
provisioner:
name: ansible
verifier:
name: testinfra
✅ 실행 명령
cd roles/nginx
molecule test
9. 운영 환경 추적 및 감사 로그 설계
모든 작업 결과를 파일로 기록하거나, 중앙 로깅 시스템과 연동하여 이력 추적이 가능합니다.
📄 ansible.cfg 로그 설정 예
[defaults]
log_path = ./logs/ansible-run.log
또는 JSON, syslog 연동도 가능합니다:
stdout_callback = json
callback_whitelist = profile_tasks, timer
10. 고급 DevSecOps와 보안 정책 적용
보안 정책을 구성하고 지속적으로 검증하는 작업에도 Ansible을 사용할 수 있습니다.
📄 CIS Harden 플레이북 예시
- name: Enforce password policies
hosts: all
become: yes
tasks:
- name: Ensure password expiration
lineinfile:
path: /etc/login.defs
regexp: '^PASS_MAX_DAYS'
line: 'PASS_MAX_DAYS 90'
또한 OpenSCAP, Lynis 등의 보안 감사 툴 실행도 플레이북으로 자동화 가능합니다.
'Devops > Ansible' 카테고리의 다른 글
[Ansible] 앤서블(Ansible) 실전 종합 예제 - 알림 연동 + 다중 환경 배포 + 테스트 자동화 (0) | 2025.04.19 |
---|---|
[Ansible] 앤서블(Ansible) 실전 종합 예제 - 웹 + DB + 모니터링 자동화 아키텍처 (0) | 2025.04.19 |
[Ansible] 앤서블(Ansible) 실습 - Role 구조화, 템플릿 처리, 태그, 조건문, 보안 vault 처리, 핸들러, 로깅과 디버깅 (0) | 2025.04.19 |
[Ansible] 앤서블(Ansible) 입문 가이드 (0) | 2025.04.19 |