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를 뚫는 데 시간을 쓴 게 조금 아깝다.

참고자료