Ansible을 연습하려면 서버가 최소 두 대 필요하다. 명령을 내리는 쪽과 명령을 받는 쪽이다. 클라우드에 인스턴스를 두 개 띄울 수도 있지만, 실습 단계에서는 맥북 안에서 끝내는 편이 부담이 적다. 그래서 Multipass로 Ubuntu VM 두 대를 만들고, 한 대에서 다른 한 대를 Ansible로 제어하는 구성을 잡았다.
이 글에서는 VM 생성, 제어노드의 Ansible 설치, 제어노드에서 관리노드로 가는 SSH 키 설정까지를 정리한다.
제어노드와 관리노드, 그리고 둘 사이의 SSH 키
Ansible은 서버를 두 역할로 나눈다. 제어노드(control node)는 Ansible이 설치되어 명령을 내리는 서버이고, 관리노드(managed node)는 제어노드가 관리하는 “대상 서버"다. 이번 구성은 이렇다.
개발 PC(맥북)에서 Multipass로 VM 두 대를 만든다.
A = 제어노드(
dsoserver), B = 관리노드(dsoserver2).A 안에서 B를 Ansible로 제어한다.
graph LR
Mac["맥북 (Multipass)"] -->|multipass shell| A["A: dsoserver<br>제어노드 + Ansible"]
A -->|ssh -i ~/.ssh/id_ansible| B["B: dsoserver2<br>관리노드"]A가 B에 들어가는 방식은 SSH 키다. ssh-keygen으로 키를 만들면 두 파일이 생긴다. {키이름}.pub은 공개키로 일종의 ID이고, 확장자 없는 {키이름}은 비밀키로 비밀번호에 해당한다. A에서 키 쌍을 만든 뒤, B의 ~/.ssh/authorized_keys에 A의 공개키를 추가하면 B는 “이 ID로 들어오는 접속은 허용한다"는 상태가 된다. 그다음부터 A에서 ssh -i {비밀키 경로} ubuntu@{B 서버 IP}로 B에 접속할 수 있다.
Multipass로 VM 두 대 띄우기
brew install --cask multipass
# 버전 확인
multipass version
multipass help
# A노드(제어노드), B노드(관리노드 = 관리되는 노드) 생성
multipass launch --name dsoserver --cpus 2 --memory 2G --disk 10G
multipass launch --name dsoserver2 --cpus 2 --memory 2G --disk 10G
# 서버 목록 확인
multipass list
두 VM 모두 CPU 2개, 메모리 2G, 디스크 10G로 잡았다. multipass list에서 각 VM의 IP를 확인할 수 있다.
맥북에서 A로 SSH 접속하기, 그리고 굳이 필요했나
처음에는 맥북에서 A로도 SSH로 들어가려고 했다.
# 제어노드 구성
multipass launch --name dsoserver --cpus 2 --memory 2G --disk 10G
multipass list # dsoserver 가상서버의 IP 확인
ssh ubuntu@{위 명령어로 확인한 제어노드 서버 IP}
그런데 바로 들어가지지 않는다. 아래 둘 중 하나를 만난다.
The authenticity of host '192.168.64.10 (192.168.64.10)' can't be established.
ED25519 key fingerprint is SHA256:Ov7nyVhd50LlAVxCJs5WYmzf4TzNt3Rl+JPr7NBABqc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Permission denied (publickey).
Multipass VM은 처음에는 SSH로 접속할 수 없고, 내 Mac의 공개키도 모른다. Mac에서 공개키를 만들어 VM에 넣어줘야 한다.
# 1. 내 Mac에서 SSH 공개키 확인
ls ~/.ssh/id_dsorsa.pub
# 2. 없으면 생성
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_dsorsa
# 3-1. 생성된 공개키 읽어서 VM에 공개키 저장
cat ~/.ssh/id_dsorsa.pub | multipass exec dsoserver -- bash -c "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh"
# 3-2. 제어노드의 공개키를 관리노드에 저장방법
# 위 명령어는 multipass가 최초에는 ssh로 접속불가능 하기때문에 사용할 수 밖에 없는 명령어.
# 고객사를 대상으로하는 실무에서는 user name과 password를 통해 접속할 수 있을 것이기 때문에
# user명과, pw를 알고있다면 아래 명령어로 더 쉽고 안전하게 "제어 노드"에 있는 ssh 공개키를 "관리 노드"로
# 복사할 수 있다.(+권한도 자동 세팅, 여러 번해도 ~/.ssh/authorized_keys에는 하나만 추가됨)
ssh-copy-id -i ~/.ssh/id_dsorsa.pub ubuntu@{제어노드 IP}
# -i 옵션으로 키를 통해 ssh 접속
ssh -i ~/.ssh/id_dsorsa ubuntu@{제어노드 IP}
키 이름이 표준 이름(id_rsa, id_ed25519 등 기본값)이 아니면 -i 옵션이 항상 필요하다. id_dsorsa처럼 이름을 따로 붙였다면 접속할 때마다 비밀키 경로를 지정해야 한다.
multipass exec로 공개키를 밀어 넣는 방식은 Multipass라서 쓰는 우회로다. 실제 고객사 서버처럼 사용자명과 비밀번호로 접속할 수 있는 환경이라면 ssh-copy-id가 낫다. 권한 설정까지 알아서 해준다. 여러 번 실행해도 authorized_keys에는 한 줄만 들어간다.
다 해놓고 보니 이 과정은 굳이 필요 없었다. 맥북에서 A로 들어갈 때는 multipass shell {A노드명}이면 된다. SSH 키 설정은 A에서 B로 접속할 때만 하면 되는 작업이다.
A(제어노드)에 Ansible 설치하기
A에 들어가서 pipx로 Ansible을 설치한다.
# A노드 접속한 상태 #
pipx --version # pipx 유무 확인
sudo apt install pipx # 없으면 설치
pipx install --include-deps ansible # Ansible 설치
pipx ensurepath # /home/ubuntu/.local/bin에 ansible path 업데이트(cli로 ansible을 사용하기 위함)
source ~/.bashrc # path 변경사항 적용
pipx ensurepath를 빼먹으면 설치는 됐는데 ansible 명령을 못 찾는다. ~/.local/bin을 PATH에 넣고 source ~/.bashrc로 바로 반영한다.
A에서 B로 SSH 키 열기
이제 진짜 필요한 작업이다. A에서 Ansible 전용 키를 만들고, 공개키를 B의 authorized_keys에 넣는다.
# A노드 접속한 상태 #
# 키 생성
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_ansible
cat ~/.ssh/id_ansible.pub # 공개키 확인 후 복사하기!
exit # A노드 로그아웃
multipass shell {관리노드명}
vi ~/.ssh/authorized_keys # 인증된 키 목록 편집
# 복사한 공개키 추가
B도 처음에는 SSH로 들어갈 수 없어서 multipass shell로 B에 직접 들어가 공개키를 붙여 넣었다. 다시 A로 돌아와 ssh -i ~/.ssh/id_ansible [email protected]을 실행하면 B의 셸이 뜬다.


프롬프트가 ubuntu@dsoserver2로 바뀌면 A에서 B로 가는 길이 열린 것이다. Ansible이 관리노드에 붙을 준비는 여기까지다.
정리
제어노드는 Ansible이 설치된 쪽, 관리노드는 제어받는 쪽이다. 둘을 잇는 건 SSH 키다.
SSH 키 설정은 제어노드에서 관리노드 방향으로만 있으면 된다. 맥북에서 VM으로는
multipass shell이면 충분하다.키 이름을 기본값과 다르게 지었다면
ssh -i로 비밀키 경로를 매번 지정한다.실제 서버라면
multipass exec대신ssh-copy-id를 쓴다.
VM 두 대를 띄우고 SSH를 여는 것까지는 생각보다 금방 끝났다. 맥북에서 A로 SSH를 뚫는 데 시간을 쓴 게 조금 아깝다.
참고자료
- Ansible Installation Guide — pipx로 Ansible을 설치하는 공식 방법