[K8S Deploy] ANSIBLE 기초-1

진웅·2026년 1월 17일

k8s deploy

목록 보기
7/20

Ansible이란?

  • IT 자동화 도구다. IT 업무를 코드로 작성해서 여러 환경에 동일하게 적용할 수 있게 해준다.
  • 2014년 마이클 데한이 만들었고, 2015년 레드햇이 인수해서 지금까지 관리하고 있다.
  • 파이썬과 앤서블 코어만 설치하면 어디서든 플레이북(YAML 형식의 작업 절차 파일)을 작성하고 실행할 수 있다.
  • k8s 설치도구인 kubespray 도 ansible 기반이다.

핵심 특징 3가지

1. 에이전트 불필요 (Agentless)

  • 기존 자동화 도구(Puppet, Chef)는 관리 대상 서버마다 에이전트를 설치해야 했다
  • Ansible은 SSH로만 접속하면 끝
    • 그래서 경험상 서버간 ssh 통신을 위한 키교환 작업이 꽤 중요하다
  • 데몬이나 추가 패키지 설치 불필요
  • 이게 Ansible의 가장 큰 장점이다

2. 멱등성 (Idempotent)

  • 같은 작업을 여러 번 실행해도 결과가 동일하다
  • 시스템을 원하는 상태로 유지하도록 설계됨
  • 실수로 여러 번 실행해도 안전하다는 의미
    • 실제 운영 시스템에서 ANSIBLE 활용이 큰 의미를 주는 이유

3. 쉬운 사용법

  • YAML 문법으로 작성해서 읽기 쉽다
  • 에디터만 있으면 된다
  • 시스템 관리부터 클라우드 모듈까지 다양하게 제공된다
  • 예제 찾기 쉽다
    • 이건 이제 뭐 생성형 AI가 있으니..ㅎ

분류

커뮤니티 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  # 한 번에 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 의 변경이 없다.
멱등성이다.

# 멱등성 있는 Ansible playbook
- name: nginx가 설치되어 있는 상태로 만들기
  apt:
    name: nginx
    state: present  # "설치된 상태"를 보장
  • 첫 실행: nginx 없음 → 설치함 (changed)
  • 두 번째 실행: nginx 이미 있음 → 아무것도 안함 (ok)
  • 세 번째 실행: nginx 이미 있음 → 아무것도 안함 (ok)

다이어그램 구성

상단: 멱등성 O (초록색 박스)

  • "전등을 켜진 상태로 만들어라" 명령
  • 3번 실행해도 결과 동일 (전등 켜진 상태 유지)

하단: 멱등성 X (빨간색 박스)

  • "전등 스위치를 누르다" 명령
  • 실행할 때마다 상태가 바뀜 (켜짐 ↔ 꺼짐)

맨 아래: Ansible 실제 코드 예시

  • state: present로 "설치된 상태"를 보장

핵심 차이

Ansible (멱등성 O)

  • "원하는 상태"를 정의
  • 현재 상태를 확인하고 필요할 때만 작업

일반 스크립트 (멱등성 X)

  • "동작"을 실행
  • 현재 상태와 무관하게 무조건 실행

profile
bytebliss

0개의 댓글