나의 삽질 저장소!

Ansible ad hoc 명령어 사용해보기! - ansible 이해하기 4편

by softPine

ansible ad hoc 명령은 ansible cli를 사용하여 하나 이상의 managed node에 대한 단일 작업을 자동화한다. ad hoc 명령은 빠르고 쉽지만 재사용이 불가하다. 이 ad hoc 명령부터 배워야 하는 이유는 먼저 ansible에 단순성과 강력함을 볼 수 있고 여기서 배우는 개념을 playbook으로 쉽게 직접 이식이 된다.

 

ad hoc 명령을 사용하는 이유

이 ad hoc 명령은 거의 반복하지 않는 작업에 사용할 때 적합하다. 예를 들어, 휴가를 위해 lab에 있는 모든 컴퓨터의 전원을 끌려면 따로 playbook을 작성하지 않고 ansible에서 한줄 짜리 명령어를 실행하면 된다. ad hoc 명령은 다음과 같다.

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

위 명령어의 patternmodule에 대해서는 연결된 링크를 확인한다.

 

ad hoc 명령 작업의 사용 사례

playbook과 같이 ad hoc task는 선언적 모델을 사용하여 지정된 최종 상태에 도달하는 데 필요한 작업을 계산하고 실행한다. 현재 상태가 지정된 최종 상태와 다르지 않다면 아무것도 하지 않고 시작 전에 현재 상태를 점검하여 멱등성을 제공한다.

 

서버 리부팅

ansible cli 유틸리티의 기본 모듈은 ansible.builtin.command 모듈이다. ad hoc task를 사용하여 명령 모듈을 호출하고 atlanta의 모든 웹 서버를 한번에 재부팅 할 수 있다. ansible이 이 작업을 수행하려면 먼저 inventory의 [atlanta] 라는 그룹에 모든 서버를 나열하고 해당 그룹에 포함된 시스템에 대해 접속 가능한 ssh 자격 증명이 있어야 한다. 이 atlanta 그룹의 모든 서버를 재부팅을 진행하려면 다음의 명령을 사용한다.

ansible atlanta -a "/sbin/reboot"

기본적으로 ansible은 한번에 5개의 프로세스만 작동한다. 이는 /etc/ansible/ansible.cfg 에 설정되어 있는 forks = 5 값에 의해 그렇다. 만약 동시 작업을 해야 하는 수가 5개가 넘어간다면 다음의 명령어로 동시 프로세스의 수를 늘릴 수 있다.

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

ansible은 기본적으로 현재 사용자 계정에서 실행된다. 다른 사용자로 연결을 하려면 -u 플래그를 사용한다.

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

리부팅을 하는데 권한이 필요하다면 접근할 수 있는 사용자 계정으로 시스템에 연결하고 become 키워드를 사용하여 root 사용자로 명령을 실행할 수 있다.

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

--ask-become-pass 또는 -K 를 추가하면 ansible을 권한 에스컬레이션에 사용할 암호(sudo, su, pfexec, doas, etc)를 입력하라는 메시지를 표시한다.

명령 모듈은 파이프 및 리디렉션과 같은 확장 셸 구문을 지원하지 않는다(쉘 변수는 항상 작동 가능함). 명령 모듈에 쉘 특정 구문이 필요한 경우 shell 모듈을 사용한다. 

지금까지는 기본 command 모듈만 사용했다. 다른 모듈을 사용하려면 -m 모듈이름을 사용한다. 예를 들어 ansible.builtin.shell 모듈을 사용하려면 다음과 같다.

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

ansible ad hoc cli(playbook과는 반대)를 사용하여 명령을 실행 시 로컬 셸에서 변수를 유지하여 ansible에 전달하도록 shell quoting 규칙에 특히 주의하여 사용한다. 예를들어 위 예제에서 만약 작은 따옴표가 아니라 큰 따옴표를 사용하면 현재 control node의 환경 변수가 전달된다.

 

파일 관리

ad hoc 명령은 ansible 및 SCP의 기능을 활용하여 여러 파일을 여러 시스템에 병렬로 전송할 수 있다. [atlanta] 그룹의 모든 서버로 파일을 직접 전송하려면 다음의 커맨드를 사용한다.

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

위와 같은 작업을 반복하려면 playbook에서 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"

디렉토리(recursive) 삭제 및 파일 삭제

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

 

패키지 관리

ad hoc 명령을 사용하여 yum과 같은 패키지 관리 모듈을 사용하여 managed node에 패키지를 설치, 업데이트 또는 삭제를 할 수 있다. 패키지를 업데이트하지 않고 설치 여부만 확인하려면 다음 명령을 입력한다.

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=httpd state=installed"

패키지를 삭제하려면 다음 명령을 입력한다.

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

ansible에는 여러 플랫폼에서 패키지를 관리하기 위한 모듈들이 있다. 패키지 관리자용 모듈이 없는 경우 command 모듈을 사용하여 패키지를 설치하거나 패키지 관리자용 모듈을 만들 수 있다.

 

유저와 그룹 관리

ad hoc 명령으로 managed node에서 사용자 계정을 생성, 관리 및 제거할 수 있다.

# foo user 생성
ansible all -m ansible.builtin.user -a "name=foo password=<crypted password here>"

# foo user 삭제
ansible all -m ansible.builtin.user -a "name=foo state=absent"

 

서비스 관리

모든 웹서버에 서비스가 시작되었는지 확인하는 명령이다.

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

재시작하려면 state만 restarted로 변경하면 된다.

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

서비스를 중지하려면 stopped로 변경한다.

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

 

facts 수집

facts는 시스템에 대해 발견 된 변수를 나타낸다. facts를 사용하여 task의 조건부 실행을 구현할 수 있을뿐만 아니라 시스템에 대한 임시 정보도 얻을 수 있다.

ansible all -m ansible.builtin.setup

특정 facts만 표시하도록 출력에 대해 필터링을 할 수 있다. 자세한 내용은 다음 link를 확인한다.

이제 ansible 명령의 기본 요소를 이해했으므로 ansible playbook을 사용하여 반복적인 작업을 자동화하는 방법을 알아본다.

블로그의 정보

나의 삽질저장소

softPine

활동하기