devops

Ansible 앤서블의 기본 개념과 Role, Task, Handler 예시 본문

DevOps/Ansible

Ansible 앤서블의 기본 개념과 Role, Task, Handler 예시

vata500 2022. 9. 27. 14:59
반응형

지금까지 Terraform을 통해서 클라우드 인프라 리소스를 생성하고 관리했다. 그러나 Terraform은 사실상 클라우드 아키텍처를 구성하거나, 새로 생성, 변경하는데 효율적인 인프라 관리 도구다.

https://medium.com/geekculture/the-most-simplified-integration-of-ansible-and-terraform-49f130b9fc8

생성하고 나서부터, 동작 중인 서버를 효율적으로 관리, 운영하는데 사용될 수 있다. 물론 Terraform과 동일한 기능이 있으나, 이미 생성된 인프라에 application을 구성하고 배포, 관리하는데 아주 효과적이다.

그래서 Terraform과 Ansible은 통합되어 상호보완적으로 활용될 수 있다고 생각한다.

Ansible

Ansible은 크게 Control Node와 Managed Node로 나뉜다. Python 베이스로 작동하며, Control과 Managed Node 모두 Python이 기본적으로 설치되어야 한다. (Python3.5 이상 버전을 권장)

Control Node는 SSH 프로토콜을 통해서 다수의 Managed node를 관리한다.

Control Node

Ansible CLI tool(ansible-playbook, ansible, ansible-vault 등)을 통해서 명령을 managed node에 실행하는 역할을 담당한다. 

Managed Node

host라고 불리며, 명령을 통해서 관리되는 노드다. 

이 Managed Node를 관리하기 위해서는 여러 요소가 필요하다.

Inventory

하나이상의 노드들이 정리된 리스트다. Inventory에는 IP주소와 같이 각 노드의 정보를 저장한다. group과 변수 설정이 가능하기 때문에 다수의 노드들을 손쉽게 관리할 수 도 있다. 

Playbook

앤서블의 기본 실행 단위로, 'execution concept'라고도 한다. YAML로 작성된다.  이 파일에는 아래와 같은 Concept들이 있다.

  • Role : 이미 정의된 Ansible content(Task, Handler, Variable, Plugin, 등)를 재사용하기 위해서 사용한다.  역할을 정의하고 directory별로 분리한다.
  • Task : managed node에 적용할 task를 말한다. 
  • Handler : 함수와 비슷한 역할을 한다. playbook의 Task가 Handler를 호출하면, 해당 Handler가 실행된다. 

Role의 directory 구조와 사용 예시

Playbook 작성에 정의된 Role이 사용된다.

$ tree roles/
roles/
├── apache
│   ├── files 
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   ├── tasks
│   │   ├── Amazon.yml
│   │   ├── firstpage.yml
│   │   └── main.yml
│   ├── templates
│   │   └── index.html
│   └── vars
│       └── main.yml

- files : managed 서버에 배포할 파일의 위치
- handlers : linux service를 처리하기 위해서 사용
- meta : role에 대한 정보, 호환 버전 등의 메타 데이터를 정의
- tasks : playbook에 작성한 task와 동일
- templates : managed 서버에 배포할 템플릿 파일 위치
- vars : 사용할 변수 정의

-name : install server
 hosts : all
 become : yes
 
 roles:
 	- role: ./roles/apache  # role 호출
    
    ...

위에서 구성한 role 다이렉토리(apache)를 playbook에서 호출하고 playbook을 실행하면 된다.

Task와 Handler 사용 예시

- hosts: test
  become: yes
  tasks:
   - name: Install Nginx
     apt:
       name: nginx
       state: latest
       update_cache: true
     notify:
      - Start Nginx

  handlers:
   - name: Start Nginx
     service:
       name: nginx
       state: started

- hosts에 'test'라는 태그를 가진 서버에 해당 playbook을 실행한다.
- become:yes 를 통해서 아래 task는 root 권한으로 실행한다.
- tasks 블럭에서 Nginx를 설치하며, notify는 handler를 호출한다.
- handler 블록에는 Nginx를 실행한다.
- tasks 블록의 Nginx가 설치완료 시, handler를 통해 Nginx가 실행된다. 

Module

모듈은 ansible에서 사용하는 '명령어'라고 볼 수 있다. 모듈은 하나의 작은 프로그램으로 ansible이 python 코드를 사용하기 때문에 python version에 종속성을 가진다.

https://docs.ansible.com/ansible/latest/network/getting_started/basic_concepts.html

 

반응형
Comments