Devops/Ansible

[Ansible] 앤서블(Ansible) 실전 종합 예제 - 알림 연동 + 다중 환경 배포 + 테스트 자동화

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

 

앤서블

  • Slack/Email 기반 모니터링/알림 연동
  • dev/stage/prod 분리 기반의 다중 환경 자동화 배포 구조
  • Molecule 기반의 자동화 테스트 체계 구축

🔔 1. 알림 연동 (Slack / Email / Teams)

📁 구조

callback_plugins/
├── slack_notify.py
ansible.cfg

📄 slack_notify.py

from ansible.plugins.callback import CallbackBase
import requests

class CallbackModule(CallbackBase):
    CALLBACK_VERSION = 2.0
    CALLBACK_TYPE = 'notification'
    CALLBACK_NAME = 'slack_notify'

    def v2_runner_on_ok(self, result):
        msg = f"✅ SUCCESS: {result.task_name} on {result._host.name}"
        self.send_slack(msg)

    def v2_runner_on_failed(self, result, ignore_errors=False):
        msg = f"❌ FAILED: {result.task_name} on {result._host.name}"
        self.send_slack(msg)

    def send_slack(self, message):
        url = 'https://hooks.slack.com/services/XXXX/XXXX/XXXX'
        requests.post(url, json={"text": message})

📄 ansible.cfg 설정

[defaults]
callback_plugins = ./callback_plugins
stdout_callback = default

🏗️ 2. 다중 환경 자동화 배포 구조 (dev/stage/prod)

📁 구조

inventory/
├── dev.yml
├── stage.yml
└── prod.yml
playbooks/
├── deploy.yml
└── vars/
    ├── dev.yml
    ├── stage.yml
    └── prod.yml

📄 deploy.yml

- name: Deploy App
  hosts: app_servers
  become: yes
  vars_files:
    - "playbooks/vars/{{ env }}.yml"
  tasks:
    - name: Install app
      shell: "echo 'Deploying {{ app_name }} {{ app_version }}'"

📄 vars/dev.yml

app_name: sample-web
app_version: 1.0-dev

📄 실행 예제

ansible-playbook -i inventory/dev.yml playbooks/deploy.yml -e env=dev
ansible-playbook -i inventory/prod.yml playbooks/deploy.yml -e env=prod

✅ 3. 테스트 자동화 (Molecule + Testinfra)

📁 구조

roles/
  web/
    molecule/
      default/
        molecule.yml
        prepare.yml
        converge.yml
        verify.yml
        tests/
          test_default.py

📄 molecule.yml

platforms:
  - name: instance
    image: docker.io/ubuntu:22.04
    pre_build_image: true
provisioner:
  name: ansible
  playbooks:
    converge: converge.yml
    verify: verify.yml
verifier:
  name: testinfra

📄 test_default.py

def test_nginx_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

def test_nginx_running(host):
    svc = host.service("nginx")
    assert svc.is_running
    assert svc.is_enabled

✅ 실행 명령

cd roles/web
molecule test

🔄 통합 실행 흐름

🧪 개발 환경

ansible-playbook -i inventory/dev.yml playbooks/deploy.yml -e env=dev

🔎 테스트

cd roles/web && molecule test

🚀 프로덕션 배포

ansible-playbook -i inventory/prod.yml playbooks/deploy.yml -e env=prod

🔔 알림 자동 발송

  • 모든 작업 상태는 Slack으로 자동 전송됨
728x90
반응형