Ansible

개요

앤서블은 여러 서버를 효율적으로 관리할 수 있게 해주는 환경 구성 자동화 도구이다.
전형적인 IaC 툴로 이미 프로비저닝된 인스턴스들에 대해 SSH로 접근하여 각종 필요한 조작을 수행한다.
파이썬으로 만들어졌으며 중앙 집중 관리가 가능하다.

구조

앤서블은 크게 3가지 구성 요소를 가진다.[1]

인벤토리

제어될 대상을 정의하며 ini 확장자를 쓴다.(yaml로도 가능)

[webserver]

web1 ansible_host = aaa.app.host
web2 ansible_host = bbb.app.host

[db]

db1 ansible_host = aaa.db1.host
db2 ansible_host = bbb.db2.host

ssh로 접근할 대상을 정의하고 방법을 명시한다.

플레이북

인벤토리에서 정의된 대상에 무슨 작업을 할지 정의하며, yaml 파일을 쓴다.

- name: ngins install
  hosts: all
  become: true
  tasks:
    - name: ngix package install
    yum:
       name: nginx
       state: installed

nginx install 이란 작업을 정의했다.
그리고 이때 구체적인 task로 nginx 패키지를 설치하는 작업을 넣었다.
이렇게 플레이북에 정의되는 각종 작업을 태스크라고 부른다.
그리고 각 각 태스크는 다시 tasks 처럼 하위 필드를 가질 수 있다.

앤서블이 실행될 때는 반드시 단 하나의 플레이북을 가지고 있어야 한다.
그 플레이북 안에 여러 태스크들을 넣는 것이다.
근데 이 태스크들은 전부 다른 파일에 작성해도 된다!
플레이북에서 import나, include 필드를 사용해서 명시만 해주면 된다.
또한 태스크들도 태스크를 참조할 수 있다.
그래서 보통 최소 작업 단위가 되는 태스크들을 정의하고, 이들을 여기썼다 저기썼다 하면서 전체 플레이북을 구성한다.

최소 작업 단위 태스크는 위처럼 yum 이런 특수한 명령과 동작을 수행하는 필드를 가지고 있다.
이렇게 실제 실행과 관련된 특수 필드를 가진 것들을 모듈이라고 부른다.
앤서블에서는 각종 실제 동작하는 작업들을 필드로 작성할 수 있는데, 이에 대한 각 동작 모듈이 만들어져있기 때문이다.
이는 달리 말해 자신만의 동작 모듈을 만들어서 넣어주면 그것을 작업으로 수행하는 것도 가능하다는 것이다.
대표적으로 Kubespray가 앤서블에 클러스터 구축 관련 모듈들을 만들어서 제공하고 있다.

태스크를 정의하는 것은 좋으나, 태스크를 수행하면서 각종 필요한 변수, 설정 파일들을 그룹화시켜 관리하고 싶을 수 있다.
이럴 때는 role로 태스크를 정의힌다.
roles라는 디렉토리 안에 각 롤을 디렉 단위로 정의하며, 안 속 내부 구조는 또 자유롭게 만들면 되는데 대신 무조건 main.yaml 파일을 있어야 한다.

사용법

기본적인 플레이북을 이용한 사용법은 이렇다.

ansible-playbook -i inventory/myhosts.ini playbook.yml

사용할 플레이북과 인벤토리를 지정해준다.
인벤토리는 디렉토리 단위를 지정해도 상관없는데, 이때 반드시 내부에 인벤토리 역할을 하는 파일이 들어있어야 한다.

inventory/mycluster/
├── hosts.yaml               ← 메인 인벤토리 (필수)
├── group_vars/              ← 그룹별 변수 디렉토리
│   ├── all.yml              ← 전체 공통 변수
│   └── kube_control_plane.yml  ← 특정 그룹만의 변수
├── host_vars/               ← 호스트별 변수 디렉토리
│   └── node1.yml            ← 특정 호스트만의 변수

앤서블은 인벤토리 파일과 같은 층위에 group_vars와 host_vars 디렉토리가 있으면 해당 파일 내용물을 읽어서 적용한다.
해당 내용물에는 플레이북에 적용돼야할 여러 변수 정보들을 넣어주면 된다.

참고

이 부분은 Kubespray 코드를 뜯어보면서 추론한 내용이다.

보통은 인벤토리에서 지정할 변수들의 기본값을 설정해두는 defaults 롤을 하나 만들어서 변수 값들을 때려박고, 다른 롤들을 쓸 때 해당 롤을 먼저 명시하여 변수들이 지정되게 한다.
그리고나서 그런 변수들에 대한 커스텀이 필요하다면 그때 인벤토리에 해당 변수를 써넣는다.
이렇게 하면 기본값들이 적용되다가도 원하는 변수만 수정할 수 있게 된다.
플레이북과 인벤토리는 분리돼어 사용할 수 있다보니 각 인벤토리를 관리하다가 오는 실수를 명확하게 제어하고자 함인 것으로 보인다.

롤 중에서

하위 문서

이름 is-folder index noteType created
도커 true - knowledge 2024-08-05
Vagrant - - knowledge 2024-06-13
Ceph - - knowledge 2024-10-17
Grafana - - knowledge 2024-06-13
Loki - - knowledge 2024-06-13
Google Workspace - - knowledge 2024-06-20
Bitnami false - knowledge 2024-06-13
Git true - knowledge 2024-10-24
Terraform false - knowledge 2025-02-05
Cloud-init false - knowledge 2025-02-22
Prometheus false - knowledge 2025-02-26
Thanos false - knowledge 2025-02-26
buildKit false - knowledge 2025-05-04
Vault true 0 knowledge 2025-04-11
Ansible false 15 knowledge 2025-06-10

관련 문서

EXPLAIN - 파생 문서

이름0related생성 일자

Dataview: No results to show for table query.

기타 문서

Z0-연관 knowledge, Z1-트러블슈팅 Z2-디자인,설계, Z3-임시, Z5-프로젝트,아카이브, Z8,9-미분류,미완
이름0코드타입생성 일자

Dataview: No results to show for table query.

참고


  1. https://kim-dragon.tistory.com/13 ↩︎