종강하면서 연구실에서 다루고 있는 연구 주제로 오픈소스 가상 스위치인 Open vSwitch의 내부 프로젝트인 OVN(Open vSwitch Virtual Network)에 대해 공부하게 되었다. OVN의 가장 대표적인 기능은 피지컬 머신들의 토폴로지의 상관없이 통신할 수 있도록 각 호스트간의 Overlay된 연결을 제공하는 것이다. 이런 기능을 제공하기 때문에, 기능 테스트를 위해서는 다수의 피지컬 머신을 갖춰야만 했고, 이 부분이 테스트하는데 귀찮고, 까다로운 부분이었다. 물론 연구실에 남는 데스크탑을 토대로 구축하면 됐을 일이지만, 연구실에서 보유 중인 데스크탑을 사용해봤으나 상태가 썩 좋지 않았다. 자연스레 VM 쪽으로 눈을 돌리게 됐다. VM을 사용한 테스트 환경 구축은 데스크탑을 일일히 가져와서 선을 꼽고, 준비하는 것에 비하면 너무 간편했다. 그러나 하이퍼바이저를 활용하여 로지컬한 머신을 생성하고, 생성한 머신에 OS를 설치하고, 다시 테스트에 필요한 소프트웨어를 설치하는 과정을 반복적으로 수행해야 한다는 점이 여전히 불편함으로 남았다. 그래서 이번에는 더욱 편하게 VM을 Provisioning 할 수 있는 방법에 대해서 알아보게 되었고, Vagrant를 알게되었다.


 아래는 Windows10 64bit 버전의 OS 환경에서 하이퍼바이저(VirtualBox)를 활용하여 Ubuntu-14.04.3 64bit 서버 VM 환경을 구축하는 내용을 다루고 있다.




1. Vagrant?


 Vagrant는 가상화 기술을 사용자로 하여금 쓰기 쉽고, 편하게 하여 개발 환경을 손쉽게 구축해주는 도구다. Vagrant를 활용하면 다양한 테스트 및 개발에 필요한 환경을 빠르게 구축할 수 있다는 점이 가장 큰 장점이다. 따라서 다양한 개발환경에서 기능 테스트를 수행하거나, 이전에 제작했던 시스템의 환경과 동일한 환경을 재현하는 데 사용될 수 있다. Opencloudengine의 Wiki에서는 다음과 같이 Vigrant의 이점을 설명하고 있으나, '빠르고, 간편한 VM Provisioning'으로 요약할 수 있겠다.

    • 과거 구축했던 개발 및 운영 환경을 즉시 재현할 수 있다.
    • 개발자가 만든 VM 이미지를 다른 개발자들과 공유할 수 있다.
    • VM 구성 및 배포를 커맨드 몇 번만으로 빠르게 진행할 수 있다.
    • 개발자가 구성한 VM을 서버에서도 그대로 사용할 수 있다.
    • VM 공유 기능을 제공한다.
    • 설치가 매우 쉽다.
    • 소프트웨어 구성 비용이 없다.
    • 유지보수 비용을 최소화할 수 있다.

 그러나 Vigrant는 오픈스택과 같은 Cloud IaaS를 구성하지 않는다. Network, Storage, Compute 가상화를 포함하는 가상화 기술을 제공하지는 않는다. 또한 그럴싸한 Web UI 제공이 안되며, VMware를 기반으로 사용하기 위해서는 유료 플러그-인을 구매해야하는 점이 있다.


2. Vagrant 사용과 Box에 대한 이해


 Vagrant 사용에 앞서 선행되어야 할 부분이 일부 있다. 먼저 하이퍼바이저 VirtualBox를 다운받아서 설치하도록 하자. 그 다음 마찬가지로 Vagrant 공식 페이지에서 제공하는 파일을 OS에 맞게 다운받아 설치하도록 한다. (필자는 Windows10 환경에서 진행했다.) 이렇게 두 개의 설치만 진행되면 사용을 위한 준비는 끝났다.


 이제 명령프롬프트를 켜서 아래의 두 명령어를 치면 VM이 자동적으로 설치된다. Vagrant 공식 페이지에서 제공하는 문서에서는 Root 디렉토리에 새로운 폴더를 만들어, 그 안에서 아래의 명령어를 수행하는 것을 권장하고 있다. 아래의 화면처럼 나온다면 설치가 정상적으로 진행된 것이다. 아마 대부분 눈치챌 수 있듯이, init 명령어 뒤에 들어가는 인수에 따라 어떤 버전의 OS로 설치할 지 결정한다. 각각의 OS를 담고 있는 이미지를 BOX라고 칭하는 데, 본 포스팅에서는 Ubuntu-12.04 64bit 버전인 precise64로 VM을 생성하고 있다.


vagrant init hashicorp/precise64

vagrant up




 앞서 말한 것과 마찬가지로 vagrant init 명령어는 뒤에 작성된 URL로부터 VM 세팅을 위한 템플릿을 가져온다. https://atlas.hashicorp.com/boxes/search에 접속해보면, vagrant에서 제공하고 있는 OS별, 구성요소별로 Box 설정을 위한 파일이 제공되고 있다. 이들 중 VM 환경으로 사용을 원하는 Box를 선택하고, init 명령어를 통해 해당 정보를 가져옴으로써 원하는 시스템 환경을 구축할 수 있다. 그리고 vagrant up 명령어를 통해 가져온 설정 정보를 토대로 VM을 생성해준다.


 아래의 화면을 보면 Virtual Box를 설치한 직후 아무것도 없는 상태에서 아래와 같이 하나의 로지컬 머신이 생성된 것을 확인할 수 있다.




 vagrant init 명령어를 치면, 해당 디렉토리에 'Vagrantfile' 파일이 생성된다. 이전에 Box가 VM 생성을 위한 템플릿이었다면, vagrantfile은 생성될 VM에 대한 세부 설정을 정의한다고 볼 수 있다. VM을 생성할 때, 어떤 box 파일을 사용할 것인지, VM에 할당할 CPU, Memory, Network 등의 configuration을 vagrantfile에서 정의 및 수정할 수 있다.



 'vagrant up' 명령어를 실행할 때 위와 같은 오류가 발생한다면 이는 Virtual Box 버전에 따른 오류다. 필자도 아래와 같은 오류를 해결하는데 시간을 꽤 많이 할애 했는데, 설정을 잘못 했다거나(사실 설정이라 할 것도 없지만..), 설치 과정에서 문제가 있었던 것은 아니었다. 단지 갱신된 Virtual Box 버전에 따라 동작하지 않았던 것이다. Vagrant 동작을 확인한 버전은 Virtualbox 5.0.24이므로 해당 버전으로 설치할 것을 권고하는 바이다.



3. VM Provisioning


 Vagrant를 사용하여 VM을 생성한다고 해도, 완벽한 Provisioning이 진행됐다고 보긴 어렵다. 각 VM에서 개발환경에 필요한 소프트웨어 설치가 수동으로 필요하다면, 이는 절반뿐인 Provisioning이다. 따라서 웹 서버, 미들웨어, DB등을 설치하고, Configuration 하기위한 방법이 필요하다. 물론 VM 생성을 위한 이미지 자체에 이들을 포함시켜서 배포하는 경우도 있지만, 이 경우 한 종류의 개발 환경만 배포되므로 유연한 사용은 어렵다.





 Vagrant는 이런 불편함을 해소할 수 있는 Provisioning 기능을 제공한다. VM 생성 후, vagrantfile에 기술된 provisioning script를 수행함으로써 필요한 소프트웨어를 자동으로 설치하고, configuration해준다. 위 사진처럼 Vagrantfile 작성 시, VM 시스템 환경을 구축하자마자 bootstrap.sh에 작성된 스크립트 언어에 맞춰 필요한 소프트웨어를 설치하고 설정해준다. 한 가지 주의할 점은 vagrantfile의 provisioning 부분에 기술된 명령어는 vagrant up, reload, provision 세 개의 멸령어가 실행될 때마다 매번 실행된다. 따라서 스크립트 내에 해당 소프트웨어가 설치되었는지 확인 후에, 설치가 안된 소프트웨어에 대해서만 설치를 진행하다록 스크립트를 작성하는 것이 좋다.



4. Vagrant를 활용한 다양한 개발환경 구축


 위에서 설명한 것과 마찬가지로 Vagrant를 활용하면 다양한 개발환경 구축이 간편하고 빠르게 가능하다. Vagrant 활용의 이해를 돕기 위해 아주 기본적인 환경 모델을 나열해봤다.

    • Ubuntu + Apache
    • Ubuntu + MySQL
    • Ubuntu + Tomcat
    • CentOS + Apache
    • CentOS + MySQL
    • CentOS + Tomcat

나열된 목록과 같이 box 및 vagrant provisioning 기능을 활용하여 서로 다른 형태의 VM을 빠르게 구축할 수 있다는 점이 바로 vagrant의 큰 매력과 장점이다.


5. 마치며...


 대학원에 진학 한 뒤로 반복적인 테스트는 일상이다. 반복속에서 특정 요인만 변경하면서 계속 실험결과를 추적해야하는 상황이 많다. 특히 우리 연구실의 경우에는 VM을 활용한 테스트 환경을 구축해야 하는 일이 잦은 편이다. 따라서 이번 기회에 배운 Vagrant를 활용하면, 앞으로 남은 대학원 생활 동안에 효율적으로 일을 할 수 있을 것 같다. 아직은 기본적인 사용에만 익숙하고, 나만을 위한 완벽한 Provisioning까지는 어려운 상황이다. Vagrant가 제공하는 Provisioning 기능을 활용하여 보다 디테일하고 타이트하게 구성되는 나만의 테스트환경 구축을 위해 조금 더 들여다봐야 할 것 같다.



6. 참고


https://www.virtualbox.org/wiki/Downloads

https://www.vagrantup.com/downloads.html

https://www.vagrantup.com/docs/getting-started/

http://wiki.opencloudengine.org/pages/viewpage.action?pageId=2852295

http://bcho.tistory.com/806





-13. 05. 02

아침일찍 떠난 대전여행, 발표는 만족스럽지 못했지만 좋은 사람들과.


금의한양-

희민이형, 원경이, 승주, 마음이.


-16.01.27

연락이 뜸한 희민이형은 현대로

취업을 절대 못할 것이라 생각했던 원경이는 SK로

어디서든 잘할 것 같았던 마음이는 LINE으로

난 광주과학기술원으로.


나만 잘되면 되겠다.