ad hoc 명령 소개

ad hoc 명령 소개 (Introduction to ad hoc commands)

Ansible ad hoc 명령은 /usr/bin/ansible 커맨드 라인 도구를 사용해 하나 이상의 관리 대상 노드에서 단일 작업을 자동화해요. 빠르고 간편하지만 재사용할 수는 없어요.

그렇다면 굳이 ad hoc 명령을 배워야 하는 이유가 뭘까요? ad hoc 명령은 Ansible의 단순함과 강력함을 그대로 보여주거든요. 여기서 배운 개념은 그대로 플레이북 언어로 이어져요. 예제를 읽고 실행하기 전에 먼저 인벤토리를 어떻게 구성하는지(How to build your inventory)를 읽어 두는 게 좋아요.

출처: 문서

본문

왜 ad hoc 명령을 쓰나요? (Why use ad hoc commands?)

ad hoc 명령은 자주 반복하지 않는 작업에 아주 유용해요. 예를 들어 휴가를 떠나기 전에 실습실의 모든 머신을 꺼두고 싶다면, 플레이북을 작성하지 않고 한 줄짜리 명령으로 처리할 수 있어요. ad hoc 명령은 이렇게 생겼어요.

$ ansible [pattern] -m [module] -a "[module options]"

-a 옵션은 key=value 문법이나, 더 복잡한 옵션 구조가 필요할 때는 {로 시작해 }로 끝나는 JSON 문자열로 옵션을 받아요. 패턴과 모듈에 대한 자세한 내용은 다른 페이지에서 더 배울 수 있어요.

ad hoc 작업의 사용 사례 (Use cases for ad hoc tasks)

ad hoc 작업은 서버 재부팅, 파일 복사, 패키지·사용자 관리 등 다양한 일을 처리할 수 있어요. an ad hoc 작업에서도 어떤 Ansible 모듈이든 사용할 수 있죠. ad hoc 작업은 플레이북처럼 선언적 모델을 사용해요. 즉 지정한 최종 상태에 도달하기 위해 필요한 동작을 계산하고 실행해요. 작업을 시작하기 전에 현재 상태를 확인하고, 현재 상태가 지정된 최종 상태와 다르지 않으면 아무것도 하지 않는 방식으로 일종의 **멱등성(idempotence)**을 달성해요.

서버 재부팅하기 (Rebooting servers)

ansible 커맨드 라인 유틸리티의 기본 모듈은 ansible.builtin.command 모듈이에요. ad hoc 작업으로 command 모듈을 호출해 애틀랜타의 모든 웹 서버를 10대씩 재부팅할 수 있어요. 이를 위해 먼저 인벤토리에 [atlanta]라는 그룹으로 애틀랜타 서버들을 나열하고, 각 머신에 연결 가능한 SSH 자격 증명이 있어야 해요. [atlanta] 그룹의 모든 서버를 재부팅하려면:

$ ansible atlanta -a "/sbin/reboot"

기본적으로 Ansible은 동시 프로세스를 5개만 사용해요. 호스트 수가 fork 수보다 많으면 Ansible이 호스트와 통신하는 시간이 늘어날 수 있어요. [atlanta] 서버를 10개의 병렬 fork로 재부팅하려면:

$ ansible atlanta -a "/sbin/reboot" -f 10

/usr/bin/ansible은 기본적으로 사용자 계정으로 실행돼요. 다른 사용자로 연결하려면:

$ ansible atlanta -a "/sbin/reboot" -f 10 -u username

재부팅은 권한 상승(privilege escalation)이 필요할 가능성이 높아요. become 키워드를 사용하면 username으로 서버에 연결한 뒤 root 사용자로 명령을 실행할 수 있어요:

$ ansible atlanta -a "/sbin/reboot" -f 10 -u username --become [--ask-become-pass]

--ask-become-pass 또는 -K를 추가하면 Ansible이 권한 상승(sudo/su/pfexec/doas 등)에 사용할 비밀번호를 물어봐요.

참고: command 모듈은 파이프나 리다이렉트 같은 확장 쉘 문법을 지원하지 않아요(단, 쉘 변수는 항상 동작해요). 명령에 쉘 특유의 문법이 필요하면 shell 모듈을 대신 사용하세요.

지금까지 예제는 모두 기본 'command' 모듈을 사용했어요. 다른 모듈을 쓰려면 -m으로 모듈 이름을 전달해요. 예를 들어 ansible.builtin.shell 모듈을 사용하려면:

$ ansible raleigh -m ansible.builtin.shell -a 'echo $TERM'

Ansible ad hoc CLI(플레이북과 달리)로 명령을 실행할 때는 쉘 따옴표 규칙에 특히 주의해야 해요. 그래야 로컬 쉘이 변수를 유지한 채 Ansible로 전달해 주거든요. 위 예제에서 작은따옴표 대신 큰따옴표를 쓰면 변수가 현재 머신에서 평가되어 버려요.

파일 관리하기 (Managing files)

ad hoc 작업은 Ansible과 SCP의 힘을 이용해 여러 파일을 병렬로 여러 머신에 전송할 수 있어요. 파일을 [atlanta] 그룹의 모든 서버로 직접 전송하려면:

$ ansible atlanta -m ansible.builtin.copy -a "src=/etc/hosts dest=/tmp/hosts"

이런 작업을 반복할 계획이라면 플레이북에서 ansible.builtin.template 모듈을 쓰는 게 낫겠죠.

ansible.builtin.file 모듈은 파일의 소유자와 권한을 변경할 수 있어요. 이 옵션들은 copy 모듈에도 그대로 전달할 수 있어요:

$ ansible webservers -m ansible.builtin.file -a "dest=/srv/foo/a.txt mode=600"
$ ansible webservers -m ansible.builtin.file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"

file 모듈은 mkdir -p처럼 디렉터리를 만들 수도 있어요:

$ ansible webservers -m ansible.builtin.file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"

디렉터리(재귀적으로)와 파일을 삭제할 수도 있어요:

$ ansible webservers -m ansible.builtin.file -a "dest=/path/to/c state=absent"

패키지 관리하기 (Managing packages)

관리 대상 노드에 패키지를 설치·업데이트·제거할 때는 yum 같은 패키지 관리 모듈을 쓰면 돼요. 패키지 관리 모듈은 설치·제거·일반 관리의 공통 기능을 지원해요. 특정 패키지 관리자만의 기능 중 일반적인 패키지 관리에 속하지 않는 것은 Ansible 모듈에 없을 수도 있어요.

패키지가 설치되어 있게 하되 업데이트하지 않으려면:

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=present"

특정 버전의 패키지를 설치하려면:

$ ansible webservers -m ansible.builtin.yum -a "name=acme-1.5 state=present"

패키지를 최신 버전으로 유지하려면:

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=latest"

패키지가 설치되어 있지 않게 하려면:

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=absent"

Ansible에는 다양한 플랫폼의 패키지를 관리하는 모듈이 있어요. 만약 여러분의 패키지 관리자용 모듈이 없다면 command 모듈로 패키지를 설치하거나, 직접 모듈을 만들어 사용할 수 있어요.

사용자와 그룹 관리하기 (Managing users and groups)

ad hoc 작업으로 관리 대상 노드에 사용자 계정을 만들고 관리·제거할 수 있어요:

$ ansible all -m ansible.builtin.user -a "name=foo password=<encrypted password here>"

$ ansible all -m ansible.builtin.user -a "name=foo state=absent"

모든 옵션(그룹과 그룹 멤버십 조작 방법 포함)에 대한 자세한 내용은 ansible.builtin.user 모듈 문서를 참고하세요.

서비스 관리하기 (Managing services)

모든 웹 서버에서 서비스를 시작하도록 하려면:

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=started"

대안으로 모든 웹 서버에서 서비스를 재시작하려면:

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=restarted"

서비스가 중지되도록 하려면:

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=stopped"

사실 수집하기 (Gathering facts)

facts는 시스템에 대해 발견된 변수를 나타내요. 작업의 조건부 실행을 구현할 때도, 시스템에 대한 ad hoc 정보를 얻을 때도 사용할 수 있어요. 모든 facts를 보려면:

$ ansible all -m ansible.builtin.setup

특정 facts만 표시하도록 출력을 필터링할 수도 있어요. 자세한 내용은 ansible.builtin.setup 모듈 문서를 참고하세요.

체크 모드 (Check mode)

체크 모드에서는 Ansible이 원격 시스템에 아무 변경도 하지 않아요. 명령을 출력만 하고 실행하지는 않아요.

$  ansible all -m copy -a "content=foo dest=/root/bar.txt" -C

위 명령에서 체크 모드(-C 또는 --check)를 활성화하면 Ansible이 실제로 어떤 원격 시스템에서도 /root/bar.txt 파일을 만들거나 업데이트하지 않아요.

패턴과 ad hoc 명령 (Patterns and ad-hoc commands)

ad hoc 명령에서 패턴으로 대상을 제한하는 방법을 포함해 모든 옵션에 대한 자세한 내용은 패턴 문서를 참고하세요.

이제 Ansible 실행의 기본 요소를 이해했으니, Ansible Playbooks로 반복 작업을 자동화하는 법을 배울 준비가 됐어요.

더 알아보기 (Learn more)

  • ad hoc 명령은 반복하지 않는 단발성 작업에 최적이에요. 반복할 작업은 플레이북으로 옮기는 게 좋아요.
  • 기본 모듈은 command지만, 쉘 문법이 필요하면 shell, 파일·패키지·서비스·사용자 관리는 각각 전용 모듈을 쓰면 돼요.
  • 체크 모드(-C)를 쓰면 변경 없이 어떤 일이 일어날지 미리 확인할 수 있어요.