소개
자동화는 의도한 호스트에 도달할 때만 안전합니다. 한 머신을 가리키는 두 별칭, 누락된 호스트, 지나치게 넓은 선택 범위 때문에 명령의 성공이 오해를 일으킬 수 있습니다.
이 실습에서는 서로 다른 두 SSH 대상을 canary와 stable 그룹으로 구성하고, 부모 그룹을 살펴보며, 호스트 패턴을 미리 확인하고, canary에만 표식 파일을 만듭니다. Ansible과 교육용 연결은 이미 준비되어 있으므로 인벤토리와 명령 범위를 다룹니다.
호스트를 그룹으로 구성하기
이 단계에서는 기존의 두 SSH 호스트의 신원이나 주소를 중복시키지 않고 그룹으로 묶습니다.
Terminal을 열고 프로젝트로 이동합니다.
cd /home/labex/project
편집하기 전에 제공된 인벤토리를 읽습니다.
cat inventory.ini
이 파일은 서로 다른 ansible_host 값으로 web1과 web2를 정의합니다. 이 줄들과 [all:vars] 연결 설정을 유지하세요. 인벤토리 이름은 호스트를 식별합니다. 같은 이름을 여러 그룹에 넣어도 다른 서버가 생기지는 않습니다.
그룹은 호스트 집합을 나타냅니다. 첫 번째 호스트에는 canary, 두 번째에는 stable을 사용하고, 두 그룹을 포함하는 부모로 webservers를 사용합니다. 다음 섹션을 덧붙이세요. >>는 기존 파일을 보존하며 따옴표로 감싼 히어 도큐먼트 구분자는 붙여 넣은 텍스트를 문자 그대로 유지합니다.
cat >> inventory.ini <<'EOF'
[canary]
web1
[stable]
web2
[webservers:children]
canary
stable
EOF
[canary]와 [stable]에는 호스트 이름이 들어갑니다. :children으로 끝나는 섹션에는 그룹 이름이 들어가므로 webservers는 canary와 stable에 속한 호스트를 상속합니다. 이 그룹들 아래에 새 대상 주소를 넣지 마세요.
ansible-inventory --graph는 해석된 구성원 관계를 그립니다.
ansible-inventory --graph
canary 아래에는 web1, stable 아래에는 web2가 있고 두 그룹 모두 webservers 아래에 있어야 합니다. 특수 항목 all과 ungrouped도 나타날 수 있습니다. 호스트는 여러 그래프 가지에 나타나더라도 여전히 하나의 인벤토리 호스트입니다.
호스트 패턴은 명령의 대상을 선택합니다. 모듈을 실행하지 않고 부모 그룹을 미리 확인합니다.
ansible webservers --list-hosts
정확히 web1과 web2가 표시되어야 합니다. 패턴에서 :&는 교집합을 뜻하며 두 부분 모두에 속한 호스트를 선택합니다. 셸이 &를 해석하지 않도록 따옴표로 감싸세요.
ansible 'webservers:&canary' --list-hosts
web1만 표시되어야 합니다. 이 미리 보기를 통해 호스트를 변경하기 전에 선택 실수를 발견할 수 있습니다.
변경을 canary로 제한하기
이 단계에서는 stable 호스트와 컨트롤러를 보존하면서 canary에서 작은 변경을 수행합니다.
명령의 첫 번째 패턴은 초기 집합을 선택합니다. --limit은 이를 더 좁히며 집합 밖의 호스트를 추가하지 않습니다. 제한된 선택을 사용하기 전에 미리 확인합니다.
ansible webservers --limit canary --list-hosts
web1 한 호스트가 표시되어야 합니다. 아무것도 일치하지 않는 제한은 명령이 모듈 실패 없이 종료되더라도 변경의 성공을 증명하지 못합니다.
앞선 실습의 command 모듈로 touch를 실행합니다. 이 Linux 명령은 파일이 없으면 빈 파일을 만들고, 있으면 타임스탬프를 갱신합니다. 표식 파일은 관리 대상 automation 사용자의 홈에 있어야 합니다. 따옴표로 감싼 -a 값은 실행 파일과 경로를 함께 유지합니다.
ansible webservers --limit canary -m ansible.builtin.command -a 'touch /home/automation/canary-ready'
web1에 대해서만 성공한 명령 결과가 나와야 합니다. 이 동작은 의도적으로 단순한 범위 연습입니다. touch는 반복 실행 시 타임스탬프를 갱신할 수 있으므로 CHANGED 상태는 멱등성을 보여 주는 예가 아닙니다.
각 관리 사용자의 홈에서 보이는 파일을 확인합니다. ls는 Ansible의 command 모듈로 실행되므로 각 대상의 디렉터리를 나열합니다.
ansible webservers -m ansible.builtin.command -a 'ls /home/automation'
web1 결과에는 canary-ready가 포함되어야 합니다. web2 결과에는 해당 이름이 없어야 하며 stdout이 비어 있을 수 있습니다. 이들은 컨트롤러 작업 공간과 별개인 원격 디렉터리입니다.
마지막으로 컨트롤러의 현재 디렉터리를 확인합니다.
ls
프로젝트 구성과 인벤토리가 표시되고 로컬 canary-ready 표식 파일은 없어야 합니다. 컨트롤러를 변경한 것이 아니라 실제 관리 호스트를 선택한 것입니다. 이후 실습에서는 파일 상태를 직접 선언하는 모듈을 사용한 다음 멱등성을 검증합니다.
요약
서로 다른 두 인벤토리 신원을 보존하고 호스트와 자식 그룹을 구성했으며, 따옴표로 감싼 교집합 패턴을 미리 확인하고 --limit으로 명령 범위를 좁혔습니다. 실제 대상 상태를 통해 표식 파일이 canary에만 존재하고 stable 호스트와 컨트롤러는 변경 범위 밖에 유지되었음을 확인했습니다.


