공부일지/클라우드 SA 교육

Ansible 개념과 구성요소

박수빈98 2025. 6. 23. 23:08

클라우드 아키텍트 교육이 심화 단계까지 왔다.

  • 하이퍼바이저를 사용한 온프레미스 환경 구축
  • 퍼블릭/프라이빗 클라우드를 활용한 환경 구축

이 두 큰틀로 학습을 했고, 각각 세미프로젝트를 진행해 봤다.

 

당시 이 환경들을 구성하는 건 전부 일일이 수작업으로 진행했다.

학습하는 과정이니 하나하나 해보면서 하는건 어쩌면 당연하겠지만

 

이제 실무적인 측면에서는 이러한 번거로운 단계를 줄이고 싶어할 것이다.

그러기 위해 IaC라는 방식이 나왔고, 그걸 할 수 있게하는 Ansible과 Teraform에 대해서 배울 것이다.

먼저 서버 내부를 구성할 수 있는 Ansible에 대해 알아보자

Ansible

서버에 환경(소프트웨어, 환경변수 등)을 구성하는 IaC 툴

인프라를 만드는 Teraform을 배우기 전에 먼저 하나의 Ansible이 설치된 서버를 통해
직접 그 서버들에 접속해서 명령어를 치는 것이 아닌, 원격으로 코드를 통해 환경을 설정할 수 있다.

 

이건 매우 큰 이점을 주는데 

1. VM에 접속해서 명령어를 직접 입력하며 환경설정

  • 접속 번거로움
  • 명령어 일일이 입력 번거로움

 

2. VM에 환경설정 스크립트를 실행하기

  • 명령어를 일일이 입력하는 시간은 줄었지만,
  • 여전히 많은 서버에 직접들어가서 스크립트를 실행해야하는 번거로움이 있음

 

3. 원격으로 지정된 VM에 맞는 코드로 한 번에 환경 설정하기

 

  • 다수의 대상 서버를 SSH로 자동 접속
  • OS, 역할에 맞는 설정 코드를 YAML로 작성
  • 실행하면 지정된 서버들에 자동으로 환경 구성 적용
     

-> 이걸 할 수 있게 하는게 Ansible이다.

 

Ansible 구성요소

인벤토리(그룹의 모임)

 

  • 대상 서버(host)를 정의하는 파일
  • INI, YAML, 동적(스크립트) 형태 가능

 

[web] ---------> 그룹
10.178.0.3 
10.178.0.4
10.178.0.5 ----> 호스트

[db]
10.178.0.30
10.178.0.40

그룹

 

  • 인벤토리 내에서 호스트들을 묶는 단위
  • 역할이나 환경(dev, prod 등)별로 묶음

 

 

호스트

 

  • 실제로 Ansible이 접속하여 작업을 수행할 서버
  • SSH 기반으로 연결됨

 

 

플레이북

 

  • YAML로 작성된 자동화 스크립트
  • 어떤 호스트에 어떤 작업을 할지 정의
- hosts: web
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

 

테스크

 

  • 한 가지 작업 단위
  • 예: 패키지 설치, 서비스 시작, 파일 복사 등

모듈

 

  • Ansible이 실제 작업을 수행할 때 사용하는 기능 단위
  • 예: apt, yum, copy, service, template 등

롤(Role)

 

  • 코드 구조화 단위 (모듈화, 재사용성 향상)
  • 변수, 핸들러, 템플릿, 테스크 등을 디렉토리 구조로 정리
  • 가장 많이 쓰임
roles/
└── nginx/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    │   └── nginx.conf.j2
    ├── files/
    │   └── default.conf
    ├── vars/
    │   └── main.yml
    ├── defaults/
    │   └── main.yml
    └── meta/
        └── main.yml

 

 

 

 

이건 플레이북에서 사용할 수 있는 라이브러리 같은 느낌임

nginx 서버를 구성하기위한 다양한 것들을 모아 두는 것이다.

 

예시 시나리오로 알아보기

지금까지 나온 구성요소를 사용하며 하나의 시나리오를 통해 알아보자

 

목표 시나리오

"웹 서버 2대에 Nginx를 설치하고, 커스텀 설정파일을 배포하고, 서비스 시작까지 자동화 하자"

 

구성 요소 정리

  • 인벤토리(hosts): 대상 서버 정보
  • Playbook: 웹 서버에 필요한 작업 실행 시나리오
  • Role (webserver): Nginx 설치 + 설정 + 시작 역할
  • Template: 설정 파일을 변수로 만들어 배포

 

1. /etc/ansible/hosts 또는 inventory/hosts

[webservers]
192.168.10.10
192.168.10.11

 

2. site.yml (Playbook)

- name: Web server provisioning
  hosts: webservers
  become: yes
  roles:
    - webserver

여기서 roles/webserver를 통해 provisioning하려 함

 

3. roles/webserver/tasks/main.yml

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

- name: Copy nginx config file
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: Restart nginx

이 두개 Task가 수행됨

이렇게 플레이북에 넣지 않으면 재사용하기 편하다

4. roles/webserver/handlers/main.yml

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

이건 일반 테스크처럼 보이지만, 조건이 충족될 경우에만 실행되는 후속 작업임

nginx 설정파일이 변경 됐을 경우 서비스 재시작이 필요하기 때문에

5. roles/webserver/vars/main.yml

server_port: 8080
  • 역할(Role) 내부에서 쓸 변수들을 정의
  • 고정 변수, 그룹별/호스트별 변수와는 별개
  • vars/는 강한 우선순위를 가짐

6. roles/webserver/templates/nginx.conf.j2

server {
    listen {{ server_port }};
    server_name localhost;

    location / {
        root /var/www/html;
        index index.html;
    }
}

 

 

  • Jinja2 문법을 사용해 동적으로 설정 파일을 생성
  • 변수값 삽입, 조건문, 반복문 가능
  • 확장자는 .j2 (Jinja2)

 

실행 명령어

ansible-playbook -i inventory/hosts site.yml

 

 

마무리

자동으로 서버 내부를 구성할 수 있는 Ansible에 대해서 개념적으로 공부했다.

이제 실습을 통해 실제 GCP에 서버를 띄우고 Ansible로 관리하는 실습을 진행해보겠다.