Menu

문서정보

목차

VirtualBox로 Chef 개발/테스트 환경 꾸미기

개인적으로 애용하는 가상화 툴이라서 virtualbox를 기준으로 한다. 애용하는 이유는 자유롭게 사용할 수 있으면서, 데스크탑 가상화를 위한 용도로 충분한 기능/성능을 보여주기 때문이다. dd

개발 환경

개발 프로세스

개발자는 각자의 리눅스 박스에 설치한 workstation VM에서 개발을 하고, 테스트 역시 chef client VM에서 개발을 진행한다. 일종의 sandbox 시스템이라고 할 만하다.

https://lh3.googleusercontent.com/-DoObMgnOrYI/UO5dqpfCgVI/AAAAAAAACpg/zP6iRTVe0CA/s800/Sandbox01.jpg

자신의 놀이터(샌드박스)에서 개발하고 테스트를 했다고 하면, 이 결과를 공유해서 각자의 샌드박스에서 상호 테스트 한다. 이제 스테이징 환경으로 옮겨서 다시 테스트 하고 실 환경에 적용하면 된다. 공유는 git을 이용한다. 이렇게 하나의 개발 프로세스가 완성된다.

Vagrant를 이용해서 가상화 개발 환경을 만들자.

Chef 코드를 개발한다면, 가장 먼저 chef 코드를 적용할 운영체제를 선택할 것이다. 그리고 "이러이러한 배포판의 이러한 버전을 이용해서 개발을 하자"라고 개발자들 끼리 "약속"을 할 것이다. 약속이 어긋나면, "뭐!! chef 코드가 제대로 작동하지 않는다고 ?. 내가 테스트 할 때는 잘 됐단 말야. 봐! 잘돼잖아 ?" 이런 상황이 발생할 수 있다. 운영체제의 버전이 다를 수도 있고, 운영체제 버전은 동일한데 패치버전이 다를 수도 있고, 패키지 저장소가 달라서 서로 다른 버전의 패키지가 설치돼었을 수도 있다. 개발 환경을 가상화 환경에서 구축했다면, 가상화 설정 문제가 있을 수도 있다. virtualbox의 경우 네트워크 설정이 다르거나, 디스크 인터페이스가 다르거나, 메모리 cpu core갯수, 부팅순서, 칩셋 등등등 사소한 차이에 의해서 테스트가 실패할 수가 있다.

결국 제대로된 개발환경을 만들려면, 운영체제는 물론이고 가상화 환경까지 일일이 맞춰줘야 한다. 노가다다.

약간의 센스가 있는 개발자라면 아래와 같은 개발 환경을 만들 것이다.
  1. HTTP(혹은 NFS나 FTP) 기반의 중앙 저장소를 하나 만든다.
  2. Virtualbox로 개발및 테스트를 위한 (chef-client가 설치된)VM을 만든다.
  3. Export 기능을 이용해서 OVA로 만든다. OVA파일을 중앙 저장소에 복사한다.
  4. 각 개발자는 OVA 파일을 다운로드 받아서 개발한다.
약간 더 게으른 개발자라면 그리고 잉여력이 충만한 상태라면, 좀 더 그럴듯한 virtual appliance 관리 툴을 만들 수도 있을테다. 고맙게도 잉여력이 충분한 누군가가 Vagrant를 만들어 두었다. 우리는 그냥 설치해서 사용하면 된다.
# apt-get install vagrant

Vagrant 테스트해 보기

Vagrant는 virtualbox 기반의 build configuration 툴이다. 간단히 말해서 virtualbox vm의 설정을 만들고 관리하는 툴.

Vagrant를 이용해서 가상화 환경을 만들어보자. vagrantup.com은 유저가 테스트할 수 있도록 몇 개의 box를 제공한다. Box는 vagrant에서 관리하는 가상환경의 기본 단위다. vagrant.com이 제공하는 기본 box중 lucid64.box를 이용해서 테스트를 진행한다.

테스트를 위해서 디렉토리를 하나 만들었다.
# mkdir vagrant_guide
# cd vagrant_guide

lucid64.box를 추가한다. box는 local에 저장할 수도 있고, 원격에 저장할 수도 있다. 원격 프로토콜로는 http를 지원한다. 약 300MB 정도의 default box 이미지를 다운로드 받는다.
# vagrant box add lucid64 http://files.vagrantup.com/lucid64.box
[vagrant] Downloading with Vagrant::Downloaders::HTTP...
[vagrant] Downloading box: http://files.vagrantup.com/lucid64.box
[vagrant] Extracting box...
[vagrant] Verifying box...
[vagrant] Cleaning up downloaded box...
다운로드 받은 box는 홈 디렉토리의 .vagrant.d/boxes에 저장된다. VM 포맷형식은 VMware에서 사용하는 VMDK(Virtual Machine Disk)다.

Box 프로젝트를 초기화 한다.
# vagrant init lucid64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
실행하면 Vagrantfile이 만들어진다. 이 파일은 이를테면 make의 Makefile과 같은 역할을 하는데, Box 프로젝트를 위한 설정 정보를 담고 있다.

Box를 실행하자.
# vagrant up
[default] Importing base box 'lucid64'...
[default] The guest additions on this VM do not match the install version of
VirtualBox! This may cause things such as forwarded ports, shared
folders, and more to not work properly. If any of those things fail on
this machine, please update the guest additions and repackage the
box.

Guest Additions Version: 4.2.0
VirtualBox Version: 4.1.12
[default] Matching MAC address for NAT networking...
[default] Clearing any previously set forwarded ports...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Mounting shared folders...
[default] -- v-root: /vagrant
Box를 실행하면, Vagrantfile의 내용을 참조해서 VM을 실행한다. Virtualbox UI에 VM이 실행된걸 확인할 수 있을 것이다.

내 Box를 만들어 보자

Box 저장소는 HTTP를 기반으로 하기로 했다. 작업을 위해서 mybox 디렉토리를 만들었다.
# mkdir mybox
# cd mybox

앞서 센스있는 개발자라면 vm을 export해서 서로 공유할 수 있는 환경을 만들거라고 했다. 기본적인 생각은 별차이가 없는법이라서 Vagrant 역시 센스있는 개발자가 선택한 그 방식을 따른다. 그냥 현재 virtualbox에서 만든 vm의 이름으로 간단하게 box를 만들 수 있다. 웹 서버 개발을 위해 만든 webserver01이라는 vm을 box로 만들기로 했다. Box의 이름은 webserver.box로 하기로 했다.
# vagrant package --output webserver.box --base webserver01
실행하고 나면 vm export가 진행되고, 현재 디렉토리에 webserver.box가 만들어진다.

# ls
webserver.box

웹서버 디렉토리에 box를 옮기고 나서, 테스트를 했다.

먼저 webserver box를 추가한다.
# vagrant box add webserver http://localhost/webserver.box

vagrant 설정파일을 만들고
# vagrant init

box를 실행한다.
# vagrant up
ssh로 접근 성공. 끝.

vagrant 설정 옵션들

Vagrantfile에서 사용할 수 있는 옵션들을 정리했다.

config.vm.box : 박스 이름
config.vm.box = "webserver" 

config.vm.boot_mode : vm 실행 모드, gui일 경우 vm gui console이 실행된다.
config.vm.boot_mode = :gui 
config.vm.network : vm 네트워크를 설정할 수 있다.
config.vm.network :hostonly, "192.168.57.2"  # 호스트 전용 네트워크로 IP를 192.168.57.2로 설정한다. 
config.vm.forward_port : 포트포워딩 설정. 호스트 전용 네트워크에서는 사용할 수 없다.
config.vm.forward_port 80, 8080
config.vm.shared_fold : shared 폴더 지정.
config.vm.share_folder "v-data", "/vagrant_data", "../data"

히스토리