Devops/Ansible

[Ansible] 앤서블(Ansible) 실전 종합 예제 - 웹 + DB + 모니터링 자동화 아키텍처

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

앤서블

 

이 문서는 Ansible 고급 기능들을 하나의 엔드-투-엔드 실전 아키텍처 예제로 통합하여 소개합니다. 대상 구성은 다음과 같습니다:

  • Web Layer: Nginx + 앱 배포
  • Database Layer: MariaDB
  • Monitoring Layer: Prometheus + Node Exporter
  • 동적 인벤토리 (AWS)
  • Vault, Role, Tag, Handler, Template, CI/CD 구조 반영

✅ 인프라 구조

+--------------------+         +--------------------+
|   Web Layer        |         |  Monitoring Layer  |
| - Nginx            |         | - Prometheus       |
| - App              |         | - Node Exporter    |
+---------+----------+         +---------+----------+
          |                              |
          |                              |
          v                              v
    +-----+-------------------------------+-----+
    |              DB Layer (MariaDB)          |
    +------------------------------------------+

📁 디렉토리 구조 예시

project/
├── inventory/aws_ec2.yml
├── playbook.yml
├── group_vars/
│   ├── web.yml
│   ├── db.yml
│   └── monitor.yml
├── roles/
│   ├── webserver/
│   ├── database/
│   └── monitoring/
├── vault/
│   └── secrets.yml
└── ansible.cfg

🔐 Vault 암호화 예제

ansible-vault encrypt vault/secrets.yml
mysql_root_password: "MySecretRootPass"

▶️ 통합 플레이북 예제 (playbook.yml)

- name: Deploy Web Layer
  hosts: web
  become: yes
  roles:
    - webserver

- name: Deploy DB Layer
  hosts: db
  become: yes
  roles:
    - database

- name: Deploy Monitoring Layer
  hosts: monitor
  become: yes
  roles:
    - monitoring

📦 Role: webserver

tasks/main.yml

- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Copy app.html
  copy:
    src: files/app.html
    dest: /var/www/html/index.html

- name: Apply config
  template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/sites-enabled/default
  notify: Restart nginx

handlers/main.yml

- name: Restart nginx
  service:
    name: nginx
    state: restarted

📦 Role: database

tasks/main.yml

- name: Install mariadb-server
  apt:
    name: mariadb-server
    state: present

- name: Ensure root password
  mysql_user:
    name: root
    host: localhost
    password: "{{ mysql_root_password }}"
  vars_files:
    - ../../vault/secrets.yml

📦 Role: monitoring

tasks/main.yml

- name: Install Prometheus
  apt:
    name: prometheus
    state: present

- name: Copy config
  template:
    src: prometheus.yml.j2
    dest: /etc/prometheus/prometheus.yml
  notify: Restart prometheus

- name: Enable Node Exporter
  apt:
    name: prometheus-node-exporter
    state: present

🔍 실행 예제

ansible-playbook -i inventory/aws_ec2.yml playbook.yml --ask-vault-pass

또는 CI/CD로 통합 실행:

- name: Ansible Deploy
  run: ansible-playbook -i inventory/aws_ec2.yml playbook.yml --vault-password-file vault/.vault_key

 

728x90
반응형