Build an Inventory and Poke It With Ad-hoc Commands
한국어 원문으로 표시합니다.
목표
인벤토리에 자동화 대상을 정의하고, 플레이북 없이 애드혹 명령만으로 여러 서버를 한 번에 다룰 수 있게 됩니다.
왜 중요한가
자동화 도구를 배울 때 사람들은 "무엇을 실행할까"부터 궁금해하지만, 실제 사고는 거의 언제나 "누구에게 실행됐나"에서 납니다. 인벤토리는 그 대상을 파일로 못 박아 두는 장치입니다. 그룹은 단순한 별명이 아니라 변수가 흐르는 통로이기도 합니다 — [web:vars] 에 넣은 값은 web 그룹 호스트에만 닿고, 호스트 개별 변수는 그것을 다시 덮어씁니다. 이 우선순위를 모르면 "설정이 왜 안 먹지"라는 질문에 하루를 씁니다. 그리고 대상을 좁힐 때는 반드시 실행 옵션(--limit)을 쓰세요. 인벤토리를 임시로 고치는 습관은 그 파일이 커밋되는 순간 장기 장애로 바뀝니다.
단계
/root/ans/inventory/hosts.ini를 만드세요.web그룹에web1,web2,db그룹에db1을 넣고, 세 호스트 모두ansible_host=127.0.0.1,ansible_port=2222를 갖게 하세요.- 같은 파일에
[web:vars]로app_port=8080을,[all:vars]로ansible_user=root를 추가하세요.app_port는 db1 에서는 보이면 안 됩니다. [prod:children]섹션을 만들어web과db두 그룹을 자식으로 넣으세요. prod 에 호스트를 직접 적지 마세요./root/ans/inventory/hosts.yml에 같은 구조(호스트 3개, 그룹 web/db/prod,ansible_host값)를 YAML 형식으로 표현하세요.ansible -i hosts.ini all -m ping을 실행하고 출력 전체를/root/ans/out/ping.txt로 저장하세요. 세 호스트 모두 SUCCESS 여야 합니다.- 애드혹
file모듈로/root/ans/artifacts/adhoc.d디렉터리를 권한0750으로 만드세요. web그룹만 대상으로 애드혹을 한 번 더 실행하고 출력을/root/ans/out/limit.txt로 저장하세요. db1 이 결과에 나오면 안 됩니다./root/ans/out/report.txt를 만드세요.prod에 속한 모든 호스트를그룹:호스트형식으로 한 줄에 하나씩, 사전순으로 정렬해 담습니다 (db:db1,web:web1,web:web2세 줄).
참고
ansible-inventory -i hosts.ini --list로 실제 해석 결과를 JSON 으로 볼 수 있습니다.--graph는 그룹 계층을 나무 모양으로 보여 줍니다.- 이 환경의 sshd 는
127.0.0.1:2222에서 키 인증으로 동작합니다. - 흔한 실수 1:
[prod:children]에 호스트 이름을 적는 것. children 섹션에는 그룹 이름만 들어갑니다. - 흔한 실수 2: 8번에서
.prod.hosts를 그대로 읽는 것. prod 는 자식 그룹을 통해 호스트를 가지므로 자식을 따라 내려가야 합니다.
INI 인벤토리에 web·db 그룹 만들기
/root/ans/inventory/hosts.ini 를 만드세요. web 그룹에 web1, web2, db 그룹에 db1 을 넣고, 세 호스트 모두 ansible_host=127.0.0.1, ansible_port=2222 를 갖게 하세요.
INI 인벤토리는 [그룹이름] 아래에 호스트를 한 줄씩 씁니다. 접속 정보는 호스트 뒤에 키=값 형태로 붙입니다. 이 환경의 sshd 포트를 확인하세요.
그룹 변수와 전역 변수 넣기
같은 파일에 [web:vars] 로 app_port=8080 을, [all:vars] 로 ansible_user=root 를 추가하세요. app_port 는 db1 에서는 보이면 안 됩니다.
[그룹:vars] 섹션은 그 그룹에만, [all:vars] 는 모든 호스트에 적용됩니다. db 에는 app_port 가 보이면 안 됩니다.
상위 그룹 prod 로 묶기
[prod:children] 섹션을 만들어 web 과 db 두 그룹을 자식으로 넣으세요. prod 에 호스트를 직접 적지 마세요.
[이름:children] 섹션에는 호스트가 아니라 그룹 이름을 씁니다. prod 에 호스트를 직접 적으면 안 됩니다.
같은 구조를 YAML 로 다시 쓰기
/root/ans/inventory/hosts.yml 에 같은 구조(호스트 3개, 그룹 web/db/prod, ansible_host 값)를 YAML 형식으로 표현하세요.
YAML 인벤토리는 최상위가 all: 이고 그 아래 children:, hosts:, vars: 가 옵니다. 결과가 같은지 ansible-inventory --list 로 비교하세요.
세 호스트에 ping 모듈 던지기
ansible -i hosts.ini all -m ping 을 실행하고 출력 전체를 /root/ans/out/ping.txt 로 저장하세요. 세 호스트 모두 SUCCESS 여야 합니다.
애드혹은 ansible -i 인벤토리 대상 -m 모듈 형태입니다. ping 모듈은 ICMP 가 아니라 파이썬이 도는지 확인합니다. 출력을 파일로 남기세요.
애드혹으로 디렉터리 만들기
애드혹 file 모듈로 /root/ans/artifacts/adhoc.d 디렉터리를 권한 0750 으로 만드세요.
file 모듈에 -a 로 인자를 넘깁니다. path=, state=, mode= 세 가지가 필요하고 mode 는 따옴표로 감싸는 편이 안전합니다.
대상을 web 그룹으로 좁히기
web 그룹만 대상으로 애드혹을 한 번 더 실행하고 출력을 /root/ans/out/limit.txt 로 저장하세요. db1 이 결과에 나오면 안 됩니다.
인벤토리를 고치지 말고 실행 쪽에서 좁힙니다. 그룹 이름을 대상으로 주거나 --limit 를 쓰세요.
그룹별 호스트 보고서 만들기
/root/ans/out/report.txt 를 만드세요. prod 에 속한 모든 호스트를 그룹:호스트 형식으로 한 줄에 하나씩, 사전순으로 정렬해 담습니다 (db:db1, web:web1, web:web2 세 줄).
ansible-inventory --list 의 JSON 을 jq 로 가공합니다. prod 는 자식 그룹을 통해 호스트를 갖는다는 점에 주의하세요. 정렬도 필요합니다.