Ansible이란?
- IT 자동화 도구다. IT 업무를 코드로 작성해서 여러 환경에 동일하게 적용할 수 있게 해준다.
- 2014년 마이클 데한이 만들었고, 2015년 레드햇이 인수해서 지금까지 관리하고 있다.
- 파이썬과 앤서블 코어만 설치하면 어디서든 플레이북(YAML 형식의 작업 절차 파일)을 작성하고 실행할 수 있다.
- k8s 설치도구인 kubespray 도 ansible 기반이다.
핵심 특징 3가지
1. 에이전트 불필요 (Agentless)
- 기존 자동화 도구(Puppet, Chef)는 관리 대상 서버마다 에이전트를 설치해야 했다
- Ansible은 SSH로만 접속하면 끝
- 그래서 경험상 서버간 ssh 통신을 위한 키교환 작업이 꽤 중요하다
- 데몬이나 추가 패키지 설치 불필요
- 이게 Ansible의 가장 큰 장점이다
2. 멱등성 (Idempotent)
- 같은 작업을 여러 번 실행해도 결과가 동일하다
- 시스템을 원하는 상태로 유지하도록 설계됨
- 실수로 여러 번 실행해도 안전하다는 의미
- 실제 운영 시스템에서 ANSIBLE 활용이 큰 의미를 주는 이유
3. 쉬운 사용법
- YAML 문법으로 작성해서 읽기 쉽다
- 에디터만 있으면 된다
- 시스템 관리부터 클라우드 모듈까지 다양하게 제공된다
- 예제 찾기 쉽다
분류
커뮤니티 Ansible
레드햇 Ansible 오토메이션 플랫폼
- 레드햇 서브스크립션으로 사용
- 엔터프라이즈 지원
아키텍처 구성


Ansible은 크게 제어 노드와 관리 노드 두 가지로 구성된다.
제어 노드 (Control Node) - "명령하는 곳"
- Ansible이 설치되는 노드
- 플레이북을 작성하고 실행하는 곳
- 리눅스 환경이면 제어 노드가 될 수 있다
- 파이썬이 필수로 설치되어야 한다
- 여기에만 Ansible을 설치하면 된다
관리 노드 (Managed Node) - "관리 받는 곳"
- Ansible이 제어하는 원격 시스템
- 리눅스, 윈도우 모두 가능
- Ansible 설치 불필요 (에이전트 없음)
- SSH 통신 가능해야 하고, 파이썬만 설치되어 있으면 된다
핵심 구성 요소
인벤토리 (Inventory) - "관리 대상 목록"
제어 노드가 관리하는 노드들의 주소록이다. 그룹별로 묶어서 관리할 수 있다.
192.168.10.101
[WebServer]
web1.example.com
web2.example.com
[DBServer]
db1.example.com
db2.example.com
- 인벤토리에 정의된 노드에만 접근 가능하다
- 용도별로 그룹핑할 수 있다 (웹서버, DB서버 등)
- hostfile이라고도 부른다
플레이북 (Playbook) - "작업 시나리오"
관리 노드에서 수행할 작업들을 순서대로 작성한 파일이다. YAML 문법을 사용한다.
---
- hosts: webservers
serial: 5
roles:
- common
- webapp
- hosts: content_servers
roles:
- common
- content
- 자동화의 핵심 파일이다
- 사용자가 직접 작성한다
- SSH로 관리 노드에 접근해서 작업을 수행한다
모듈 (Modules) - "실제 작업 스크립트"
- SSH로 연결 후 관리 노드에 푸시되는 스크립트다
- 시스템 상태를 설명하는 매개변수를 받는다
- 관리 노드에서 실행된다
- 실행 완료 후 자동으로 제거된다
- 데이터베이스 관리, 네트워크 설정 등 다양한 용도가 있다
플러그인 (Plugins) - "기능 확장"
- Ansible의 핵심 기능을 강화한다
- 제어 노드에서 실행된다 (모듈과의 차이점)
- 데이터 변환, 로그 출력, 인벤토리 연결 등의 기능 제공
- 연결 방식, 데이터 조작, 콘솔 출력 등을 제어한다
Playbook 상세 개념
Plays - "실행 단위"
- Playbook 안에 포함되는 기본 실행 단위다
- 관리 노드(hosts)와 작업(tasks)을 매핑한다
- 변수, 롤, 작업 리스트를 포함한다
- 반복 실행 가능하다
Roles - "재사용 가능한 컨텐츠"
- 작업, 핸들러, 변수, 플러그인, 템플릿, 파일을 묶어놓은 것
- Play 안에서 사용하려면 import 해야 한다
- 재사용성이 핵심이다
Tasks - "개별 작업"
- 관리 호스트에 적용할 액션의 정의다
- ad hoc 명령으로 단일 작업도 실행 가능하다
Handlers - "조건부 작업"
- Task의 특수한 형태다
- 이전 작업이 'changed' 상태일 때만 실행된다
- 변경이 있을 때만 재시작 같은 작업을 수행하도록 할 때 사용한다
Collections - "배포 형식"
- Playbook, Role, Module, Plugin을 포함하는 배포 단위다
- Ansible Galaxy를 통해 설치하고 사용한다
- 각 리소스는 독립적으로 사용 가능하다
요약
Ansible = 제어 노드(1대) + 관리 노드(N대)
제어 노드에서:
1. 인벤토리에 관리 노드 목록 작성
2. 플레이북에 작업 절차 작성
3. ansible-playbook 명령 실행
그러면 Ansible이:
1. SSH로 관리 노드에 접속
2. 필요한 모듈을 푸시
3. 작업 수행
4. 모듈 제거
에이전트 설치 없이 SSH만으로 수백 대 서버를 동시에 관리할 수 있다는 게 핵심이다.
멱등성의 이해를 돕기위한 추가 정리
Ansible 실제 예시에 핵심이 있다고 생각하는데 state 의 의미이다.
즉 이 ansible play를 거치는 노드의 상태는 항상 nginx 가 존재하는 상태로 유지되어야 한다는 뜻!
결국 몇번을 수행해도 해당노드의 nginx 가 이미 동작중이라 nginx 의 변경이 없다.
멱등성이다.
- name: nginx가 설치되어 있는 상태로 만들기
apt:
name: nginx
state: present
- 첫 실행: nginx 없음 → 설치함 (changed)
- 두 번째 실행: nginx 이미 있음 → 아무것도 안함 (ok)
- 세 번째 실행: nginx 이미 있음 → 아무것도 안함 (ok)
다이어그램 구성
상단: 멱등성 O (초록색 박스)
- "전등을 켜진 상태로 만들어라" 명령
- 3번 실행해도 결과 동일 (전등 켜진 상태 유지)
하단: 멱등성 X (빨간색 박스)
- "전등 스위치를 누르다" 명령
- 실행할 때마다 상태가 바뀜 (켜짐 ↔ 꺼짐)
맨 아래: Ansible 실제 코드 예시
state: present로 "설치된 상태"를 보장
핵심 차이
Ansible (멱등성 O)
- "원하는 상태"를 정의
- 현재 상태를 확인하고 필요할 때만 작업
일반 스크립트 (멱등성 X)
- "동작"을 실행
- 현재 상태와 무관하게 무조건 실행
