- Published on
Ansible이 agentless로 원격 시스템에서 실행하는 방법
- Authors
- Name
- 신주용
Ansible이란?
Ansible은 오픈 소스인 명령줄 기반 IT 자동화 소프트웨어입니다1.
Ansible의 주요 특징으로는 agentless하다는 점이 있습니다. 쉽게 설명하자면 원격 시스템에 일을 시키기 위해 원격 시스템에서 일 할 준비를 하고 있는 프로그램을 agent라고 하고, agent를 사용하는 서비스라면 미리 원격 시스템에 agent를 설치해두어야 합니다. 하지만 Ansible이 agentless하다는 말은 관리 대상이 되는 노드에 agent를 추가적으로 설치할 것 없이 Control node에서 명령을 보내기만 하면 된다는 뜻입니다. 이 과정은 기본적으로는 SSH를 이용해 실행됩니다1.
SSH로 원격 시스템에서 실행
이때까지 SSH는 원격 컴퓨터에 '접속'할 떄만 사용하는 것인 줄 알았습니다. 그도 그럴 것이 저는 SSH는 항상 원격 서버로 접속해서 터미널을 띄울 때 사용했기 때문입니다. 그런데 SSH로 원격 시스템에서 명령도 실행할 수 있다고 해서 찾아봤습니다.
refo in ~ via ⬢ v20.10.0 on 🐳 v26.1.4 (orbstack)
➜ man ssh
SSH(1) General Commands Manual SSH(1)
NAME
ssh – OpenSSH remote login client
SYNOPSIS
ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address]
# ...
destination [command [argument ...]]
ssh [-Q query_option]
DESCRIPTION
ssh (SSH client) is a program for logging into a remote machine and for
executing commands on a remote machine. # ...
# ...
If a command is specified, it will be executed on the remote host instead
of a login shell. A complete command line may be specified as command, or
it may have additional arguments. If supplied, the arguments will be
appended to the command, separated by spaces, before it is sent to the
server to be executed.
# ...
ssh
명령어에는 command
도 입력할 수 있습니다. 이 값이 존재하면 원격 호스트에서 로그인 쉘을 실행하는 대신 입력한 명령어를 실행하고 그 결과를 현재 터미널에 출력해줍니다. command
는 ls
같이 완전한 명령어만 입력할 수도 있지만 ls -a -l -h
같이 인자를 공백으로 분리하여 입력할 수도 있습니다. 이를 위해 destination
보다 뒤에 입력해야 합니다.
실습
이전 글에서 설치한 Rocky Linux VM에 명령을 보내보겠습니다.
1. 일반 명령
특정한 권한이 필요 없는 명령어를 실행시켜 봅시다. 왼쪽은 호스트 머신으로 첫 명령어 sw_vers
로 macOS임을 확인할 수 있습니다. 오른쪽은 실습 대상이 될 원격 시스템(VMware 가상머신)으로 cat /etc/os-release
명령어를 통해 Rocky Linux임을 확인할 수 있습니다.
이 때 호스트 머신에서 ssh user@host cat /etc/os-release
명령어를 실행하면 오른쪽과 동일한 결과가 출력됩니다. macOS의 /etc
디렉토리 아래에는 os-release
라는 파일이 없기 때문에 macOS에서 실행된 것이라면 에러가 났을텐데, Rocky Linux라고 출력됩니다.
다른 방법으로 확인해볼까요? 원격지에 파일 생성도 가능한지 확인해봅시다.
처움 원격지에서 ls
명령어를 실행했을 때는 디렉토리 내 파일이 없었습니다. 그리고 호스트에서 touch
명령어를 시작해 txt 파일을 생성했지만 이 파일은 ssh의 command로 들어갔기 때문에 호스트에 파일을 생성하지 않았습니다. 원격지에서 다시 ls
명령을 실행하면 20240815.txt
라는 파일이 생성된 것을 볼 수 있죠.
2. 권한이 필요한 명령
이렇게 단순한 명령어 실행이 아니라 특정한 권한을 갖고 실행해야 하는 경우가 있을 수도 있습니다. 예컨대 외부 프로그램 설치를 위해 /opt
디렉토리에 접근하려고 한다면 root 권한이 있어야 합니다2. 리눅스에서는 이런 경우에 보안상 root 사용자로 로그인해서 처리하는 것을 권장하지 않습니다. 대신 잠시 root 권한을 위임받아 동작할 수 있도록 사용자를 wheel
그룹(Debian 계열이라면 sudo
그룹)의 멤버로 등록해두죠. wheel 그룹에 속하지 않아 권한이 없는 사용자가 권한이 필요한 명령을 실행할 때 어떻게 되는지 확인해봅시다.
Permission denied
라고 하네요. 그러면 이번엔 사용자를 wheel 그룹에 추가하고 동일한 명령을 다시 실행해봅시다3.
우선 원격지의 사용자를 wheel
그룹에 추가하기 위해서는 root 권한이 필요합니다. 현재 cheesecat47
사용자는 권한이 없는 경우를 보여주려고 wheel
그룹에서 뺐기 때문에 sudo를 사용할 수 없어서 부득이하게 root 계정으로 로그인한 후 권한을 줍니다. 그 다음
- 원격지에서
ls
를 해보면 우선 기존에는 사용자 홈 디렉토리에 위에서 생성한 텍스트 파일이 있고,/opt
에는 없었습니다. - 호스트에서
sudo
권한이 필요한/opt
경로로 파일을 이동하도록 명령을 실행합니다. - 원격지에서
ls
를 다시 해보면 이제/opt
경로에 파일이 옯겨진 것을 볼 수 있습니다.
Ansible은 이것보다 더 복잡한 내부 로직으로 원격지에 명령을 보내고 실행하며 자동화를 수행할 것입니다. 하지만 간단하게나마 Ansible의 동작 원리를 실습을 통해 확인할 수 있었습니다.
참고: 이 글에서 언급되었으나 깊게 설명하지 않은 내용입니다.
- Linux 유저, 권한
- ssh (secure shell)
Footnotes
Red Hat. "How Ansible works." Ansible. https://www.ansible.com/how-ansible-works/ (accessed Aug. 15, 2024). ↩ ↩2
"디렉토리와 파일 시스템." help.ubuntu.com. https://help.ubuntu.com/kubuntu/desktopguide/ko/directories-file-systems.html (accessed Aug. 15, 2024). ↩
"Ansible 기초." docs.rockylinux.org. https://docs.rockylinux.org/ko/books/learning_ansible/01-basic/#_3 (accessed Aug. 15, 2024). ↩