소개
일회성 Ansible 명령으로 여러 호스트를 점검하거나 작고 명시적인 구성 상태를 적용할 수 있습니다. 알맞은 모듈을 선택하면 동작과 반환 결과를 더 쉽게 이해할 수 있습니다.
두 Linux 대상을 점검하고 관리 디렉터리를 준비한 다음 컨트롤러의 소스 파일을 배포합니다. 명령 실행과, 요청한 상태에 실제 변경이 필요했는지를 보고하는 모듈을 비교합니다. 인벤토리와 SSH 연결은 이미 준비되어 있습니다.
모듈로 호스트 그룹 점검하기
이 단계에서는 준비된 두 관리 노드를 점검하기 위해 일회성 Ansible 모듈을 선택합니다.
Terminal을 열고 작업 공간으로 이동합니다.
cd /home/labex/project
애드혹 명령은 플레이북 없이 선택한 인벤토리 호스트에 모듈 하나를 직접 실행합니다. 기본 형식은 ansible PATTERN -m MODULE -a ARGUMENTS입니다. 실습에는 두 SSH 대상을 모두 포함하는 webservers 그룹이 제공됩니다. 이 그룹을 미리 확인합니다.
ansible webservers --list-hosts
정확히 web1과 web2가 표시되어야 합니다. 앞선 실습의 command 모듈로 운영 체제 커널 이름을 출력하는 uname -s를 실행합니다.
ansible webservers -m ansible.builtin.command -a 'uname -s'
각 호스트는 Linux를 출력해야 합니다. command 모듈은 읽기 전용 조회도 보통 CHANGED로 보고합니다. 이 표시를 구성 변경으로 해석하지 말고 stdout과 반환 상태를 확인하세요.
setup 모듈은 관리 노드에서 발견한 구조화된 정보인 팩트를 수집합니다. 모듈의 filter 인수는 반환되는 팩트를 좁힙니다. 배포판 이름을 확인합니다.
ansible webservers -m ansible.builtin.setup -a 'filter=ansible_distribution'
성공한 각 결과에는 "ansible_distribution": "Ubuntu"를 담은 ansible_facts 객체가 포함되어야 합니다. setup은 이 점검에 대해 보통 changed: false를 보고합니다. 팩트는 컨트롤러가 아닌 대상을 설명하며 이후 실습에서는 이를 자동화에 사용합니다.
0이 아닌 태스크 결과는 실패이며 UNREACHABLE은 연결 문제를 나타냅니다. 예상 호스트가 두 개라면 성공 결과도 두 개가 필요합니다. 빈 선택을 완료된 점검과 혼동하지 마세요.
관리 디렉터리 선언하기
이 단계에서는 상태 지향 모듈로 두 대상 모두에 같은 디렉터리를 준비합니다.
file 모듈은 파일 시스템 상태를 관리합니다. path는 대상 경로를 식별하며 state=directory는 빈 파일이 아니라 디렉터리를 요청합니다. mode=0750은 소유자에게 모든 접근 권한, 그룹에 읽기/탐색 권한을 부여하고 그 외 사용자에게는 접근을 허용하지 않습니다. 앞의 0은 8진수 권한 값을 나타냅니다.
일반 태스크는 준비된 automation 계정으로 실행됩니다. 해당 사용자의 홈 안에 디렉터리를 만들므로 become은 필요하지 않습니다.
ansible webservers -m ansible.builtin.file -a 'path=/home/automation/ops state=directory mode=0750'
디렉터리를 처음 만들면 두 호스트 모두 changed: true를 보고하고 path 또는 dest 필드에 /home/automation/ops를 표시해야 합니다. automation 계정이 만들므로 디렉터리 소유자는 automation입니다.
같은 선언을 다시 실행합니다.
ansible webservers -m ansible.builtin.file -a 'path=/home/automation/ops state=directory mode=0750'
이제 두 호스트 모두 changed: false가 나와야 합니다. 요청한 상태가 이미 존재하기 때문입니다. 이는 여전히 타임스탬프를 갱신할 수 있는 touch 같은 일반 명령의 반복 실행과 다릅니다.
컨트롤러 파일을 두 대상에 복사하기
이 단계에서는 작은 컨트롤러 소스 파일을 만들고 대상 권한을 명시하여 정확한 내용을 배포합니다.
printf는 텍스트와 끝의 줄바꿈을 씁니다. >는 현재 프로젝트에 소스를 만들거나 대체합니다. 따옴표로 감싼 형식 문자열은 메시지를 함께 유지하고 \n은 줄바꿈을 요청합니다.
printf 'Managed by Ansible\n' > message.txt
copy 모듈은 컨트롤러 소스를 관리 대상으로 전송합니다. src는 컨트롤러에 있고 dest는 각 대상에 있습니다. 일반 파일에서 mode=0640은 소유자에게 읽기/쓰기, 그룹에 읽기 권한을 부여하고 그 외 사용자에게는 접근을 허용하지 않습니다.
ansible webservers -m ansible.builtin.copy -a 'src=/home/labex/project/message.txt dest=/home/automation/ops/message.txt mode=0640'
최초 복사에서 각 대상은 changed: true를 보고해야 합니다. 같은 전송을 다시 실행합니다.
ansible webservers -m ansible.builtin.copy -a 'src=/home/labex/project/message.txt dest=/home/automation/ops/message.txt mode=0640'
바이트와 요청한 권한이 이미 일치하면 changed: false가 나와야 합니다. file 모듈이 부모 디렉터리를 준비했습니다. 파일 복사는 해당 디렉터리 생성 단계를 대신하지 않습니다.
command 모듈로 실제 원격 내용을 읽습니다.
ansible webservers -m ansible.builtin.command -a 'cat /home/automation/ops/message.txt'
두 stdout 결과 모두 Managed by Ansible을 보여야 합니다. command 조회는 CHANGED를 보고할 수 있지만 앞선 copy 모듈의 changed:false 결과는 이미 일치하는 관리 파일을 설명합니다. 컨트롤러 소스는 두 원격 사본과 별도로 유지됩니다.
요약
실제 두 호스트 그룹에 애드혹 모듈을 실행하고 명령 출력을 해석했으며 배포판 팩트를 확인했습니다. 디렉터리를 선언하고 별도의 컨트롤러 소스를 명시적인 권한으로 복사했으며, 반복 실행 시 상태 지향 모듈이 일치하는 상태를 발견하면 변경 없음으로 보고하는 것을 관찰했습니다.



