Ansible 기본적인 Ad-hoc 명령어들

Ansible 기본적인 Ad-hoc 명령어들

목차

Ansible 애드혹(Ad-hoc) 명령어는 플레이북을 작성하지 않고도 원격 서버에 즉시 명령을 실행할 수 있는 한 줄짜리 명령이다. 이 글에서는 Ansible Ad-hoc 명령어의 기본 형식부터 ping, shell, yum 등 자주 쓰는 모듈의 사용법과 실행 중 만나기 쉬운 오류 해결 방법까지 예제로 정리한다.

Ad-hoc 명령어란

Ansible의 애드혹 명령어는 풀 스크립트나 플레이북을 작성하지 않고, 간단한 명령어로 원격 서버에 대해 즉시 실행할 수 있는 명령을 의미한다. 이러한 명령어는 단일 작업을 빠르게 수행할 때 유용하며, 복잡한 자동화 작업을 구성하기 전에 원격 시스템의 상태를 확인하거나 간단한 작업을 수행하는 데 사용된다.

기본 형식

애드혹 명령어는 일반적으로 ansible 커맨드 라인 도구로 실행하며, 다음과 같은 형식을 따른다.

ansible [호스트 패턴] -m [모듈 이름] -a [모듈 인자] [기타 옵션]
  1. 호스트 패턴: 명령어를 실행할 대상 호스트를 지정한다. 개별 호스트, 그룹, 또는 all로 모든 호스트를 대상으로 할 수 있다.
  2. 모듈 이름(-m 옵션): 사용할 Ansible 모듈의 이름이다. 예를 들어 파일을 복사하는 copy 모듈이나 패키지를 관리하는 yum 모듈 등이 있다.
  3. 모듈 인자(-a 옵션): 모듈에 전달할 인자다. 예를 들어 copy 모듈에는 복사할 파일의 경로와 목적지 경로가 인자로 필요하다.
  4. 기타 옵션: --become(권한 상승), -u(원격 사용자 지정), -k(SSH 비밀번호 입력 요청) 등의 추가 옵션이 있다.

애드혹 명령어는 간단한 작업을 빠르게 수행하고 결과를 즉시 확인할 수 있는 장점이 있지만, 복잡한 자동화 작업이나 재사용 가능한 설정을 구성하는 데는 한계가 있다. 따라서 주로 시스템 상태 확인, 임시 변경 적용, 간단한 관리 작업 수행 등에 사용된다.

그럼 자주 쓰는 Ad-hoc 명령어들과 사용 예시를 살펴보자.

ping 모듈로 통신 확인

먼저 다음 명령어로 호스트 리스트 파일에 등록된 서버에 ping이 되는지 확인한다.

[root@localhost ~]# ansible all -m ping -k
SSH password:
192.168.111.100 | SUCCESS => {
  "ansible_facts": {
    "discovered_interpreter_python": "/usr/libexec/platform-python"
  },
  "changed": false,
  "ping": "pong"
}

비밀번호 입력을 생략하기 위해 -k 옵션을 빼 보자. 여기서는 SSH 키를 마스터 서버에서 이미 생성하고 워커 서버에 이식했다고 가정한다.

[root@localhost ~]# ansible all -m ping
192.168.111.100 | UNREACHABLE! => {
  "changed": false,
  "msg": "Failed to connect to the host via ssh: root@192.168.111.100: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
  "unreachable": true
}

접속 사용자 오류 해결

분명 SSH 키를 생성해서 이식했는데 오류가 뜬다. 그 이유는 오류 메시지에서 root@192.168.111.100으로 접속을 시도하고 있다는 데서 알 수 있다. Ansible이 root 사용자로 원격 서버에 접속하려고 시도하지만, 해당 사용자에 대한 SSH 키 인증이 설정되지 않았거나 ansible 설정에서 사용자를 명시적으로 지정하지 않았다는 의미다.

호스트 파일의 IP 주소 뒤에 ansible_user를 추가해 접속 사용자를 지정하면 해결된다.

vi /etc/ansible/hosts

#db-[99:101]-node.example.com
192.168.111.100
[webservers]
192.168.111.100 ansible_user=centos    <-- IP 주소 뒤에 이 부분 추가

통신 상태가 되는지 다시 확인한다.

[root@localhost ~]# ansible all -m ping
192.168.111.100 | SUCCESS => {
  "ansible_facts": {
    "discovered_interpreter_python": "/usr/libexec/platform-python"
  },
  "changed": false,
  "ping": "pong"
}

통신이 잘 된다.

호스트 목록 확인 (–list-hosts)

ansible all --list-hosts 명령어는 호스트 파일(/etc/ansible/hosts)에 등록된 서버들의 주소(IP나 도메인 등) 목록을 출력한다.

[root@localhost ~]# ansible all --list-hosts
hosts (1):
192.168.111.100

shell 모듈로 명령 실행

-m shell은 원하는 셸 명령어를 사용하고 싶을 때 쓴다. 예를 들어 ansible all -m shell -a "df -h"를 입력하면, Ansible로 관리하는 모든 대상 서버에 대해 df -h 명령으로 디스크 사용량을 확인한다.

[root@localhost ~]# ansible all -m shell -a "df -h"
192.168.111.100 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 637M 0 637M 0% /dev
tmpfs 652M 0 652M 0% /dev/shm
tmpfs 652M 9.6M 642M 2% /run
tmpfs 652M 0 652M 0% /sys/fs/cgroup
/dev/sda2 76G 5.5G 71G 8% /
tmpfs 131M 16K 131M 1% /run/user/42
tmpfs 131M 3.5M 127M 3% /run/user/1000
tmpfs 131M 4.0K 131M 1% /run/user/0

yum 모듈로 패키지 설치

yum은 레드햇 계열 리눅스에서 사용하는 RPM 기반 시스템의 자동 업데이터이자, 소프트웨어 패키지 설치·삭제 도구다. yum 모듈로 아파치(httpd) 웹 서버를 설치해 보자.

[root@localhost ~]# ansible all -m yum -a "name=httpd state=present"

그런데 이번에는 다음과 같은 오류 메시지가 뜬다.

192.168.111.100 | FAILED! => {
  "ansible_facts": {
    "discovered_interpreter_python": "/usr/libexec/platform-python"
  },
  "changed": false,
  "module_stderr": "Shared connection to 192.168.111.100 closed.rn",
  "module_stdout": "sudo: 암호가 필요합니다rn",
  "msg": "MODULE FAILUREnSee stdout/stderr for the exact error",
  "rc": 1
}

권한 오류 해결

이 오류가 나는 이유는 yum으로 패키지를 설치하거나 제거하는 작업은 root 권한이 반드시 필요하기 때문이다. 여러 방법이 있지만, 여기서는 원격 서버에서 sudo를 비밀번호 없이 실행하도록 허용했다. 원격 서버에서 sudo visudo를 실행해 sudoers 파일을 안전하게 편집하고, 다음 라인을 추가해 해당 사용자에 대해 비밀번호 없이 sudo를 허용한다.

[centos@localhost ~]$ sudo visudo
centos ALL=(ALL) NOPASSWD: ALL

이제 --become 옵션과 함께 다시 yum으로 httpd를 원격 서버에 설치한다.

[root@localhost ~]# ansible all -m yum -a "name=httpd state=present use_backend=yum3" --become
192.168.111.100 | CHANGED => {
  "ansible_facts": {
    "discovered_interpreter_python": "/usr/libexec/platform-python"
  },
  "changed": true,
  "msg": "",
  "rc": 0,
  "results": [
    "Installed: apr-1.6.3-9.el8.x86_64",
    "Installed: apr-util-1.6.1-6.el8.x86_64",
    "Installed: apr-util-bdb-1.6.1-6.el8.x86_64",
    "Installed: mod_http2-1.11.3-3.module_el8.0.0+185+5908b0db.x86_64",
    "Installed: httpd-2.4.37-12.module_el8.0.0+185+5908b0db.x86_64",
    "Installed: apr-util-openssl-1.6.1-6.el8.x86_64",
    "Installed: centos-logos-httpd-80.5-2.el8.noarch",
    "Installed: httpd-filesystem-2.4.37-12.module_el8.0.0+185+5908b0db.noarch",
    "Installed: httpd-tools-2.4.37-12.module_el8.0.0+185+5908b0db.x86_64"
  ]
}

아파치 서버가 원격 서버에 잘 설치되었는지 확인한다.

[centos@localhost ~]$ systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>
Active: inactive (dead)
Docs: man:httpd.service(8)

아파치 설치가 잘 되었다.

정리

오늘은 Ansible의 Ad-hoc 명령어로 원격 워커 서버에 통신 테스트를 하고, 셸 명령을 실행하며, 웹 서버를 설치하는 실습을 해 보았다. Ad-hoc 명령어는 단일 작업을 빠르게 수행할 때 유용하며, 복잡한 자동화 작업을 구성하기 전에 원격 시스템의 상태를 확인하거나 간단한 관리 작업을 수행하는 데 적합하다.

여러 서버에 반복적인 작업을 자동화하려면 Ad-hoc 명령어 대신 플레이북이 더 효율적이다. 이어지는 Ansible 플레이북 yaml(야믈) 실행 글에서 플레이북 작성·실행 방법을 확인해 보자. Ansible에는 정말 많은 모듈이 있으므로, 더 많은 명령어는 Ansible 공식 문서에서 찾아보며 공부하는 것이 좋다.

💬 댓글 0

💬 댓글을 남기려면?
첫 댓글을 남겨보세요 ✨

이 콘텐츠가 도움이 됐나요?

누스쿨 커뮤니티에서 더 많은 커리어 전략을 나눠요