인벤토리 만들기 — 호스트와 그룹을 정의하는 방법
인벤토리 만들기 — 호스트와 그룹을 정의하는 방법
Ansible은 인프라의 관리 대상 노드, 즉 '호스트'를 인벤토리(inventory)라는 목록으로 파악하고 자동화 작업을 수행해요. 인벤토리는 명령줄에 넘겨주는 호스트 이름 목록이 될 수도 있지만, 대부분의 사용자는 인벤토리 파일을 만들어 관리해요. 인벤토리에는 자동화 대상 노드와 그 노드에 연결된 변수가 담기고, 여러 호스트를 묶는 그룹도 정의할 수 있어요.
그룹을 쓰면 연관된 호스트 여러 대를 한 번에 지정해 자동화할 수 있고, 변수도 일괄로 정의할 수 있어요. 인벤토리를 만들고 나면 패턴(patterns)을 사용해 Ansible이 실행할 호스트나 그룹을 골라내요. 이 글에서는 가장 흔한 INI와 YAML 두 형식으로 인벤토리를 구성하는 기본기를 다뤄볼게요.
출처: 공식문서
인벤토리 기초: 형식, 호스트, 그룹
가장 단순한 인벤토리는 호스트와 그룹 목록을 담은 파일 하나예요. 기본 위치는 /etc/ansible/hosts이고, 명령줄에서 -i <path or expression> 옵션을 주거나 설정으로 다른 인벤토리 소스를 지정할 수 있어요.
가장 흔한 형식은 INI와 YAML이에요. Ansible이 이 둘을 기본으로 지원하기 때문이죠. 기본적인 INI /etc/ansible/hosts는 이렇게 생겼어요.
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
꺾쇠 괄호로 감싼 부분이 그룹 이름이에요. 그룹 이름으로 호스트를 분류하고, 어떤 시점에 어떤 목적으로 어떤 호스트를 제어할지 정할 수 있어요. 그룹 이름은 유효한 변수 이름의 규칙을 따르는 게 좋아요.
같은 인벤토리를 YAML 형식으로 쓰면 이렇게 돼요.
ungrouped:
hosts:
mail.example.com:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
기본 그룹
인벤토리에 그룹을 하나도 정의하지 않아도 Ansible은 항상 두 개의 기본 그룹을 만들어요. all 그룹은 모든 호스트를 담고, ungrouped 그룹은 다른 어떤 그룹에도 속하지 않은 호스트를 담아요. 모든 호스트는 최소 두 그룹에 속해요. 예를 들어 위의 호스트 mail.example.com은 all과 ungrouped에, two.example.com은 all과 dbservers에 속하죠. all과 ungrouped는 항상 존재하지만, group_names 같은 그룹 목록에는 안 나타날 수 있어요.
여러 그룹에 속한 호스트
한 호스트를 여러 그룹에 넣을 수 있어요. 애틀랜타 데이터센터의 운영 웹 서버를 [prod], [atlanta], [webservers] 그룹에 동시에 넣는 식이죠. 그룹은 다음 기준으로 만들 수 있어요.
- 무엇(What) — 애플리케이션, 스택, 마이크로서비스(예: 데이터베이스 서버, 웹 서버 등)
- 어디(Where) — 데이터센터나 지역. 로컬 DNS·스토리지와 연동할 때 유용(예: east, west)
- 언제(When) — 개발 단계. 프로덕션 자원에서 테스트하지 않도록(예: prod, test)
다음 예시는 앞서 본 YAML 인벤토리에 what/when/where 그룹을 더한 모습이에요.
ungrouped:
hosts:
mail.example.com:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
east:
hosts:
foo.example.com:
one.example.com:
two.example.com:
west:
hosts:
bar.example.com:
three.example.com:
prod:
hosts:
foo.example.com:
one.example.com:
two.example.com:
test:
hosts:
bar.example.com:
three.example.com:
예시에서 보듯 one.example.com은 dbservers, east, prod 그룹에 동시에 존재해요.
그룹을 또 그룹으로: 부모/자식 그룹 관계
그룹끼리 부모/자식 관계를 만들 수 있어요. 부모 그룹은 중첩 그룹 또는 그룹들의 그룹이라고도 불러요. 운영 호스트들이 이미 atlanta_prod, denver_prod 같은 그룹에 들어 있다면, 그 작은 그룹들을 담는 production 그룹을 만들어 관리할 수 있어요. 호스트 추가·제거를 자식 그룹에서만 하면 부모 그룹은 자동으로 따라가니 유지보수가 줄어들어요.
부모/자식 관계를 만들려면 다음 중 하나를 쓰면 돼요.
- INI 형식 —
:children접미사 사용 - YAML 형식 —
children:항목 사용
다음 예시는 prod와 test 그룹을 부모 그룹으로 단순화한 인벤토리예요.
ungrouped:
hosts:
mail.example.com:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
east:
hosts:
foo.example.com:
one.example.com:
two.example.com:
west:
hosts:
bar.example.com:
three.example.com:
prod:
children:
east:
test:
children:
west:
자식 그룹에는 몇 가지 성질이 있어요.
- 자식 그룹의 호스트는 자동으로 부모 그룹의 멤버가 돼요.
- 그룹은 여러 부모·자식을 가질 수 있지만, 순환 관계는 만들 수 없어요.
- 호스트는 여러 그룹에 들어갈 수 있지만, Ansible은 런타임에 호스트를 한 번만 처리하고 여러 그룹의 데이터를 병합해요.
- 호스트와 그룹은 항상 '전역'이에요. 서로 다른 '가지'나 '인스턴스'에서 같은 호스트·그룹을 두 번 정의하면 같은 개체로 취급돼요. 여러 번 정의하면 새 정보를 추가하거나, 충돌하는 정보는 가장 최신 정의로 덮어써요.
호스트 범위 추가하기
YAML과 INI 같은 일부 플러그인은 호스트 범위(range)를 지원해요. 이름이 비슷한 호스트가 많다면 하나씩 나열하는 대신 범위로 추가할 수 있어요.
INI 형식:
[webservers]
www[01:50].example.com
YAML 형식:
# ...
webservers:
hosts:
www[01:50].example.com:
숫자 범위를 정의할 때 보폭(stride)을 지정해 간격을 조절할 수도 있어요.
INI 형식:
[webservers]
www[01:50:2].example.com
YAML 형식:
# ...
webservers:
hosts:
www[01:50:2].example.com:
위 예시는 www01, www03, www05, …, www49 서브도메인을 매칭해요. 보폭이 2니까 www00, www02, www50은 포함되지 않아요. 숫자 패턴은 앞의 0을 넣거나 뺄 수 있고, 범위는 양 끝을 포함해요. 알파벳 범위도 정의할 수 있어요.
[databases]
db-[a:f].example.com
이 글은 docs.ansible.com의 공식 문서 "How to build your inventory"를 강사 목소리로 요약·번역한 내용이에요. 자세한 예시(동적 인벤토리, 변수 추가, 비-SSH 연결 타입)는 원문에서 이어서 볼 수 있어요.
더 알아보기
- 동적 인벤토리: 인벤토리 플러그인으로 클라우드 제공자 등의 리소스를 실시간으로 가져오는 방법
- 여러 인벤토리 소스: 동적 인벤토리와 정적 파일을 함께 사용하는 방법 (
-i staging -i production) - 디렉터리 기반 인벤토리: 인벤토리를 디렉터리로 두고 여러 파일·플러그인·스크립트를 한 인벤토리로 묶는 방법
- 패턴(Patterns): 호스트나 그룹을 선택해 Ansible을 실행 대상으로 지정하는 방법