Ansible의 애드혹(Ad-hoc) 명령어는 Ansible의 풀 스크립트나 플레이북을 작성하지 않고, 간단한 명령어로 원격 서버에 대해 즉시 실행할 수 있는 명령을 의미한다.

이러한 명령어는 단일 작업을 빠르게 수행할 때 유용하며, 복잡한 자동화 작업을 구성하기 전에 원격 시스템의 상태를 확인하거나 간단한 작업을 수행하는 데 사용된다.

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

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

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

그럼 몇 가지 애드 훅 명령어들과 사용 예시를 살펴보자.

-m 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 설정에서 사용자를 명시적으로 지정하지 않았음을 의미한다.

오류해결 방법

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"
}

통신이 잘 된다!

ansible all –list-hosts

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

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

-m shell

사용하고자 하는 쉘 명령어를 사용하고 싶을 때 쓰는 것이다.

예를 들어 ansible all -m shell -a “df -h”를 입력하면, 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

-m 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.\r\n",
"module_stdout": "sudo: 암호가 필요합니다\r\n",
"msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
"rc": 1
}

이 오류가 나는 이유는 yum으로 패키지를 설치하거나 제거하는 등의 작업은 root 권한이 반드시 필요하기 때문이다.

여러 방법이 있지만 필자는 원격 서버에서 sudo를 비밀번호 없이 실행을 허용하였다.
원격 서버에서 sudo visudo를 실행하여 sudoers 파일을 안전하게 편집한다.

그러고 다음 라인을 추가하여 정 사용자에 대해 비밀번호 없이 sudo를 허용한다.

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

다시 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에는 정말 많은 애드 훅 명령어들이 있다. 이 명령어들을 하나하나 다 아는 것은 불가능 하므로 공식 도큐먼트에서 찾아보면서 공부하는 것이 좋을 것이다.

https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html

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

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다