가상화 소프트웨어를 더 만지작거리고 싶은데 새로운 장난감이 필요하셨다면, 오늘의 글이 마음에 드실 겁니다. 이번 글 전체가 가상화 환경의 배포와 테스트를 위한 래퍼(wrapper) 소프트웨어인 Vagrant에 관한 내용입니다.
기본 아이디어는 간단합니다. 복잡하고 지저분한 세부 명령어들을 숨기고 통합된 인터페이스를 제시한 뒤, 클라우드 같은 유행어를 얹으면 모두가 입에 담는 핫한 신기술이 되는 것이죠. OpenStack이나 OpenShift 같은 멋진 이름들과 사뭇 비슷합니다. 여기에 PostgreSQL, Jenkins, Node.js 같은 이름까지 언급하면 '현대적이고 트렌디하다'는 보너스 점수까지 딸 수 있겠죠. 하지만 빈정거림은 여기까지 하고, 이 도구가 실제로 무엇을 할 수 있는지, 쓸모와 가치, 그리고 재미가 있는지 함께 살펴보겠습니다.
Vagrant의 기본 개념
간단히 배경을 짚고 넘어가겠습니다. Vagrant는 혼합되고 빠르게 변화하는 환경에서 소프트웨어 테스트, 개발, 그리고 가상화 리소스 관리를 단순화하기 위해 처음 설계되었습니다. 초기에는 VirtualBox에서만 동작했는데, VirtualBox가 업계에서 선호하는 하이퍼바이저 선택지는 아니었죠. 그러나 최근에는 VMware, KVM 등 다른 기술도 지원하며 상당히 괜찮은 통합 기능도 갖추게 되었습니다.
요약하자면 작동 방식은 이렇습니다. 각 하이퍼바이저의 네이티브 명령 대신 vagrant 명령을 사용하는 것입니다. 여러 하이퍼바이저를 함께 사용하면 문법이 제각각이라 상당한 학습 부담이 됩니다. 바로 이 때문에 Vagrant를 통해 지저분한 세부 사항들을 유연한 추상화 계층 뒤로 숨기는 것입니다. 이론은 충분하니, 이제 실습으로 들어가 직접 배워보겠습니다.
Windows에서 환경 설정하기
좀 더 흥미롭게 만들기 위해 이번에는 Linux가 아닌 Windows에서 시연해 보겠습니다. 후속 글들(많을 거라고 약속드립니다)에서 Linux로 돌아오겠지만, 여기서는 플랫폼이 달라도 개념적으로 큰 차이가 없다는 점을 보여드리고 싶습니다.
설치를 마쳤다면 PowerShell 창을 열고 명령을 입력해 봅시다. Vagrant를 실행하려면 다음과 같이 입력합니다:
vagrant up
그런데 작업 환경을 미리 준비하고 초기화하지 않았다면 다소 투박한 오류 메시지를 만나게 됩니다:
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe up
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment. Or, get an ID of a target machine from
`vagrant global-status` to run this command on. A final option is to change to a directory with a Vagrantfile
and to try again.
메시지 그대로 vagrant init으로 환경을 초기화하면 본격적인 작업을 시작할 수 있습니다. 하지만 여기서도 또 한 번의 오류를 만나게 됩니다:
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'base' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Adding box 'base' (v0) for provider: virtualbox
default: Downloading: base
default:
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try again.
Couldn't open file /HashiCorp/Vagrant/bin/base
기본적으로 Windows 버전 Vagrant는 'base'라는 이름의 베이스 이미지로 가상 머신을 시작하려고 시도합니다. 그런데 해당 이미지가 로컬에 존재하지 않기 때문에 사전 준비 없이 up 명령을 실행하면 실패하게 됩니다.
따라서 가장 먼저 할 일은 이미지를 내려받는 것입니다. Docker와 마찬가지로 Vagrant도 자체 온라인 저장소를 갖추고 있어 기본 템플릿들이 보관되어 있습니다. 물론 운영체제 이미지를 수동으로 받아 설치할 수도 있지만, 그렇게 하면 앞서 말한 추상화 계층의 취지가 사라집니다. 다음과 같이 이미지를 받아봅시다:
vagrant box add hashicorp/base
만약 존재하지 않는 이미지를 지정하면 또다시 오류가 발생합니다:
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe box add hashicorp/base
The box 'hashicorp/base' could not be found or could not be accessed in the remote catalog. If this is a
private box on HashiCorp's Atlas, please verify you're logged in via `vagrant login`. Also, please double-check
the name. The expanded
URL and error message are shown below:
URL: ["https://atlas.hashicorp.com/hashicorp/base"]
Error: The requested URL returned error: 404 Not Found
'base' 이미지는 당연히 존재할 것이라 기대되는데 말이죠. 이 문제의 원인에 대한 자료가 온라인에 여럿 있지만, 결국 설정 파일의 기본 선언 문제로 귀결됩니다. 사용 가능한 이미지 중 하나로 변경해서 다운로드하면 문제가 해결됩니다. 실제로 Vagrantfile에서 기본 항목을 편집해야 합니다. base 문자열을 Vagrant 시작 시 기본 이미지로 사용하고 싶은 값으로 교체하세요. Ubuntu, Fedora, CoreOS 등 어떤 것이든 가능합니다:
# Every Vagrant development environment requires a box. You can search for boxes at
# https://atlas.hashicorp.com/search.
config.vm.box = "base"
이번 실습에서는 나중을 위한 좋은 이유가 있어 조금 덜 흔한 선택지인 CoreOS 이미지(yungsang/coreos)를 테스트해 보겠습니다. 이미지를 내려받은 뒤 카탈로그에 제대로 추가되었는지 확인해 봅시다:
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe box list
ubuntu/trusty64 (virtualbox, 20150506.0.0)
yungsang/coreos (virtualbox, 1.3.8)
이제 Vagrant를 다시 실행합니다. CoreOS가 부팅되면서 사용자 계정과 네트워크 설정 등 세부 사항이 자동으로 처리됩니다. 잠시 후 시스템이 정상 구동되며, SSH로 가상 머신에 접속할 수 있게 됩니다. 기본적으로 실행 중인 각 인스턴스는 localhost에 포트를 할당받습니다. 이번 경우 박스의 SSH 서비스는 127.0.0.1:2222에서 실행 중입니다. 저장소 개념이든 네트워킹 방식이든 Docker에서 봤던 것과 매우 유사합니다. 여기에는 분명한 이유가 있습니다.
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'yungsang/coreos'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'yungsang/coreos' is up to date...
==> default: Setting the name of the VM: bin_default_1431611566870_38538
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: core
default: SSH auth method: private key
default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
가상 머신에 접속하기
첫 번째 가상 머신이 정상적으로 구동되었습니다! vagrant status 명령으로 현재 상태를 확인할 수 있으며, vagrant ssh 또는 vagrant rdp 같은 래퍼 명령으로 실행 중인 가상 머신 안으로 들어갈 수 있습니다. 더 고급스러운 접속 방법들도 있지만, 그것은 네트워킹과 클러스터 구성을 다룰 후속 튜토리얼에서 살펴보겠습니다.
Windows 클라이언트에서는 원칙적으로 RDP를 사용할 수 있습니다. 하지만 이번 경우에는 CoreOS 내부에 RDP 서버가 없어 동작하지 않습니다. VNC가 대안이 될 수 있는지는 아직 확인해 봐야 할 부분입니다. 마찬가지로 SSH도 문제가 됩니다. Windows에는 기본 SSH 에이전트가 포함되어 있지 않고, PuTTY가 설치되어 있더라도 PATH 환경 변수에 등록되어 있지 않을 수 있기 때문입니다:
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe rdp default
==> default: Detecting RDP info...
RDP connection information for this machine could not be
detected. This is typically caused when we can't find the IP
or port to connect to for RDP. Please verify you're forwarding
an RDP port and that your machine is accessible.
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe ssh default -- -A
`ssh` executable not found in any directories in the %PATH% variable. Is an SSH client installed? Try
installing Cygwin, MinGW or Git, all of which contain an SSH client. Or use your favorite SSH client with the
following authentication information shown below:
Host: 127.0.0.1
Port: 2222
Username: core
Private key: C:/Users/<user>/.vagrant.d/insecure_private_key
Windows에서 작업한다면 OpenSSH 형식의 개인 키를 PuTTY 형식(.ppk) 등으로 변환해야 할 수도 있습니다. 물론 대부분의 사용자가 Vagrant를 쓰다가 겪는 상황은 아니지만, 같은 문제를 다양한 방식으로 해결해 보는 경험은 분명 유용합니다.
여기까지 우리는 VirtualBox를 프로바이더로 사용하여 첫 번째 Vagrant VM 인스턴스를 성공적으로 구동했습니다. 그런데 재미있는 점은, 테스트 과정 어디에서도 VirtualBox를 직접 다룰 필요가 없었다는 사실입니다. 명시적인 VirtualBox 명령을 입력하거나 XML 설정 파일을 신경 쓰지 않아도 말이죠. 이것은 시작에 불과하지만, 동시에 오늘 튜토리얼의 마무리이기도 합니다. 좋은 분위기로 끝내겠습니다.
함께 읽으면 좋은 자료
조금 더 깊이 있게 읽어보고 싶다면 다음 자료를 추천합니다:
- Linux Journal의 "Introducing Vagrant" 기사
- Vagrant 크래시 코스(Crash course on Vagrant)
- Docker 네트워킹 관련 아티클
결론
Vagrant는 흥미로운 개념이지만, 반드시 여러분의 환경에 있는 과제를 해결하는 최선의 방법은 아닐 수 있습니다. 가상화를 진정으로 마스터하고 싶고 설정의 모든 측면을 직접 제어해야 한다면, 필요한 시간과 노력, 인내심을 투자해 바닥부터 전부 배워야 합니다. 그렇지 않으면 문제가 발생했을 때(반드시 발생합니다) 해결하지 못하거나 기술 자체를 제대로 이해하지 못하게 됩니다.
그럼에도 불구하고 Vagrant는 분명 흥미로운 접근 방식입니다. 우리의 가상화 여정에서 이 도구를 얼마나 멀리 가져갈 수 있을지 지켜볼 가치가 충분합니다. 적어도 이번 글에서는 프로그램 설치 시 마주치는 문제와 초기 구성을 다뤘고, 이미지를 내려받아 구동하는 방법을 배웠으며, 기본적인 상태 확인과 네트워크 연결 우회 방법까지 익혔습니다. 꽤 실질적인 성과입니다. 앞으로 VMware, LXC, libvirt 연동을 확장해 주는 플러그인 프레임워크, 고급 네트워킹, 클러스터 구성 등 더욱 중요한 주제들을 다룰 예정입니다. 많은 기대 부탁드립니다.
그럼, 다음 글에서 만나요!