Ansible 기초 · 인벤토리와 애드혹 · 실습
인벤토리 만들고 애드혹으로 두드리기
목표
인벤토리에 자동화 대상을 정의하고, 플레이북 없이 애드혹 명령만으로 여러 서버를 한 번에 다룰 수 있게 됩니다.
왜 중요한가
자동화 도구를 배울 때 사람들은 "무엇을 실행할까"부터 궁금해하지만, 실제 사고는 거의 언제나 "누구에게 실행됐나"에서 납니다. 인벤토리는 그 대상을 파일로 못 박아 두는 장치입니다. 그룹은 단순한 별명이 아니라 변수가 흐르는 통로이기도 합니다 — [web:vars] 에 넣은 값은 web 그룹 호스트에만 닿고, 호스트 개별 변수는 그것을 다시 덮어씁니다. 이 우선순위를 모르면 "설정이 왜 안 먹지"라는 질문에 하루를 씁니다. 그리고 대상을 좁힐 때는 반드시 실행 옵션(--limit)을 쓰세요. 인벤토리를 임시로 고치는 습관은 그 파일이 커밋되는 순간 장기 장애로 바뀝니다.
단계
1. /root/ans/inventory/hosts.ini 를 만드세요. web 그룹에 web1, web2, db 그룹에 db1 을 넣고, 세 호스트 모두 ansible_host=127.0.0.1, ansible_port=2222 를 갖게 하세요.
2. 같은 파일에 [web:vars] 로 app_port=8080 을, [all:vars] 로 ansible_user=root 를 추가하세요. app_port 는 db1 에서는 보이면 안 됩니다.
3. [prod:children] 섹션을 만들어 web 과 db 두 그룹을 자식으로 넣으세요. prod 에 호스트를 직접 적지 마세요.
4. /root/ans/inventory/hosts.yml 에 같은 구조(호스트 3개, 그룹 web/db/prod, ansible_host 값)를 YAML 형식으로 표현하세요.
5. ansible -i hosts.ini all -m ping 을 실행하고 출력 전체를 /root/ans/out/ping.txt 로 저장하세요. 세 호스트 모두 SUCCESS 여야 합니다.
6. 애드혹 file 모듈로 /root/ans/artifacts/adhoc.d 디렉터리를 권한 0750 으로 만드세요.
7. web 그룹만 대상으로 애드혹을 한 번 더 실행하고 출력을 /root/ans/out/limit.txt 로 저장하세요. db1 이 결과에 나오면 안 됩니다.
8. /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 는 자식 그룹을 통해 호스트를 가지므로 자식을 따라 내려가야 합니다.
단계 8개
- INI 인벤토리에 web·db 그룹 만들기
- 그룹 변수와 전역 변수 넣기
- 상위 그룹 prod 로 묶기
- 같은 구조를 YAML 로 다시 쓰기
- 세 호스트에 ping 모듈 던지기
- 애드혹으로 디렉터리 만들기
- 대상을 web 그룹으로 좁히기
- 그룹별 호스트 보고서 만들기