devops
Ansible 앤서블의 기본 개념과 Role, Task, Handler 예시 본문
지금까지 Terraform을 통해서 클라우드 인프라 리소스를 생성하고 관리했다. 그러나 Terraform은 사실상 클라우드 아키텍처를 구성하거나, 새로 생성, 변경하는데 효율적인 인프라 관리 도구다.
생성하고 나서부터, 동작 중인 서버를 효율적으로 관리, 운영하는데 사용될 수 있다. 물론 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 구조와 사용 예시
$ 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
'DevOps > Ansible' 카테고리의 다른 글
Ansible UNREACHABLE! Failed to connect to the host via ssh Load key Permission denied (publickey) 오류 (0) | 2023.02.01 |
---|---|
Ansible 유용한 명령어 정리 (1) | 2022.10.06 |
Terraform으로 Ansible의 AWS EC2 다이나믹 인벤토리 구성하기 (0) | 2022.09.27 |