Vagrant - 기본+

Vagrant - 기본의 내용을 보충한다.

포트 포워딩(PORT FORWARDING)

호스트 머신의 포트를 통해서 게스트 머신의 특정 포트에 접속, 네트워크 트래픽을 게스트 머신으로 보내는 방법.

게스트 머신의 아파치에 접근하기 위해서는 아래와 같이 Vagrantfile을 편집한다. guest 속성의 80이 가상머신의 포트, host속성의 4567이 호스트의 포트다.
즉 아래와 같이 설정하면 호스트에서 http://localhost:4567로 접속하면 가상머신의 80 포트에 접속해서 아파치 화면을 볼 수 있다.

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.network :forwarded_port, guest: 80, host: 4567
end

포트를 변경한 후에는 vagrant reload 명령으로 가상머신을 재시작 한다.

가상머신의 포트 포워딩 설정이 기억나지 않을 때는 VirtualBox를 실행하고 해당 가상머신의 설정 → 네트워크 → 어댑터 1 → 포트 포워딩을 클릭하여 확인할 수 있다.

MEMORY, CPU 크기 설정

가상머신의 memory나 cpu의 크기를 변경하려면 아래와 같이 설정을 조정할 수 있다. 아래는 메모리를 2GB로, CPU를 2개로 조정한 예이다.

config.vm.provider :virtualbox do |vb|
    vb.memory = 2048
    vb.cpus = 2
end

스냅샷(SNAPSHOT) 생성/복구

가상머신의 스냅샷을 생성하려면 스냅샷 이름과 함께 vagrant snapshot save 명령을 사용한다. 아래의 예는 first_snapshot이라는 이름으로 스냅샷을 생성하고 있다.

vagrant snapshot save first_snapshot

가상머신의 상태를 복구하려면 restore 명령을 사용한다. 아래는 first_snapshot이라는 이름의 스냅샷을 이용해 가상머신의 상태를 되돌리고 있다.

vagrant snapshot restore first_snapshot

생성한 스냅샷을 이용해서 상태를 복구하려면 스냅샷의 이름을 알고 있어야 한다. 스냅샷 목록을 통해 지금까지 생성된 스냅샷의 이름을 확인할 수 있다.

$ vagrant snapshot list
first_snapshot

BOOT TIMEOUT 옵션

가상머신의 부트 시간이 너무 오래 걸려서 실패하는 경우, boot_timeout 옵션을 조정해서 시간을 늘릴 수 있다.

config.vm.boot_timeout = 600

초 단위로 지정하며 기본 값은 300이다(5분).


EOF

신고

Vagrant - 기본

윈도(Windows)를 주로 사용하지만 리눅스 환경이 필요한 경우가 많아서 Vagrant를 그간 꾸준히 사용해 왔다. 정리를 위해 Vagrant에 대한 개요와 기본 사용법을 정리해 본다.

설치

우선 Vagrant와 VirtualBox의 설치가 필요하다. 아래 주소에서 내려받아서 설치한다.

Vagrantfile 생성

vagrant init 명령을 실행하면 현재 폴더에 Vagrantfile을 생성한다. 아래와 같이 Box의 이름을 추가하면 해당 박스를 사용하는 Vagrantfile을 생성한다.

vagrant init bento/centos-7.3

이렇게 생성한 Vagrantfile에는 다량의 주석이 포함되어 있어서 이 주석만 잘 읽어봐도 기본적인 설정 방법을 아는데 무리가 없다.

Box 검색

원하는 리눅스 배포본과 버전의 Box를 아래 주소에서 검색할 수 있다.

각 리눅스 배포본 제공자의 오피셜 박스를 사용하는게 안전하다. 다만 CentOS의 경우는 Bento 프로젝트에서 제공하는 박스도 많이 사용하는 것 같다.

Vagrant machine 생성

vagrant up

위 명령을 Vagrantfile이 있는 폴더에서 실행하면 가상 머신이 생성된다.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/centos-7.3'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'bento/centos-7.3' is up to date...
==> default: Setting the name of the VM: Documents_default_1496384515554_86818
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> 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: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => C:/Users/daniel/vagrant-test

Vagrant machine에 SSH로 접속

vagrant ssh

위 명령을 Vagrantfile이 있는 폴더에서 실행하면 vagrant 사용자로 가상 머신에 SSH로 접속이 된다.
PuTTY 등의 SSH 클라이언트로 접속하려면 127.0.0.1:2222에 vagrant로 접속하면 된다. 암호 또한 vagrant다. 2222 포트로 접속하는 이유는 기본으로 가상 머신의 22 포트와 호스트 머신의 2222 포트가 port forwarding 방식으로 연결되어 있기 때문이다. 이미 다른 가상 머신이 2222 포트를 사용 중이면 다른 포트가 자동으로 할당되며, 이는 실행 로그를 통해 알아내면 된다.

Vagrant machine을 다루는 기본 명령

삭제(terminate)

vagrant destroy

정지(shutdown, poweroff)

vagrant halt

가상 머신을 끈다.

재시작(reboot, halt and up)

vagrant reload

가상 머신을 재시작한다. 정지 후 시작하는 것과 동일하다.

일시 중지(suspending)

vagrant suspend

현재의 동작 상태를 저장한 상태로 정지한다. 다시 시작하면 부팅 과정 없이 저장한 지점에서 바로 시작한다.

다시 시작(resume)

vagrant resume

일시 중지 상태의 가상 머신을 이전 지점에서 다시 시작한다.

상태 확인(status)

vagrant status

가상 머신의 상태를 확인한다. 정지 상태면 poweroff로 표시되고 정상 동작 중이면 running으로 표시된다.


EOF

신고

Vagrant 공유 폴더 문제(mount.vboxsf 관련) - vagrant-vbguest 플러그인

Vagrant를 이용해 apache brooklyn을 학습하던 중에 갑자기 brooklyn 서버가 동작을 안하는 문제가 생겼습니다. 최초로 VM을 생성했을 때는 마운트에 문제가 없었는데 재부팅을 하면 문제가 생깁니다.

이런저런 방법으로 추적해 봤더니 결국 Vagrant 혹은 VirtualBox에서 발생한 오류 때문이더군요.

brooklyn 서버의 /vagrant로 마운트되는 VirtualBox 공유 폴더가 마운트 안되는 문제인데, 아래와 같은 오류 메시지가 출력됩니다.

==> brooklyn: Mounting shared folders...
    brooklyn: /vagrant => G:/workspace/apache-brooklyn-0.11.0-vagrant
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

구글링을 해보니, VirtualBox Guest Additions 설치에 문제가 있어서 그런 것 같습니다. 여러 가지 시도를 해봤는데 결국 vagrant-vbguest 플러그인을 설치해서 해결했습니다.

vagrant-vbguest 플러그인은 guest machine과 VirtualBox host의 Guest Additions 버전이 다를 경우에 알맞은 버전을 설치해 주는 플러그인입니다.


   vagrant-vbguest 플러그인 설치

아래의 명령으로 설치합니다.

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.14.2)'!

이미 생성한 box에 적용하려면 아래의 명령으로 수동으로 설치할 수 있습니다.

$ vagrant vbguest

Guest Additions가 설치된 후 vagrant reload 명령으로 vagrant machine 재시작하니까 공유 폴더가 제대로 마운트되는 것을 실행 로그에서 확인할 수 있었습니다.

지금까지 Vagrant를 사용하면서 Guest Additions 설치에 대해서 고민한 적이 없었는데, 관련 문제를 vagrant-vbguest를 통해 해결하면서 수행 로그를 보니, 꽤 수고스러운 작업을 대신 해 주는 고마운 플러그인이네요. 어쩌면 필수 플러그인이 아닐까 싶습니다.


EOF


신고

외부 Jenkins와 내부 네트워크 상의 GUITAR 테스트 환경 연동 2

테스트 수행 VM을 Jenkins의 Slave Node로 등록

VM2를 Jenkins의 Slave Node로 추가합니다. 방법에 대해서는 아래 글을 참고하세요.

젠키스(Jenkins)에 노드(node) 추가하기

  Jenkins 대시보드에 테스트 리포트 주소 링크

Jenkins 메인 화면의 상세 내용 입력을 클릭한 후 이전 글에서 확인한 VM2의 GUITAR 리포트 주소 (http://<랩탑의 내부 아이피>:8080/report.htm)의 링크를 입력합니다.
이 링크를 통해서 Jenkins 사용자들이 테스트 리포트를 볼 수 있습니다.

만약 HTML 코드가 그대로 노출된다면 아래 글을 참고해서 진행하세요.

젠킨스(Jenkins)의 상세 내용 입력 방식을 HTML로 변경

  Jenkins에 GUITAR 테스트 프로젝트 추가

Jenkins의 새로운 Item 메뉴를 클릭하여 새로운 프로젝트를 생성합니다.

Item name에는 GUITAR_TEST를 입력하고 Freestyle project를 클릭하여 선택하고 저장합니다.


General → Restrict where this project can be run 항목을 체크하고 Label Expression에 위에서 생성한 Slave Node 이름을 입력합니다. 저의 Slave Node 이름은 GUITAR_TEST_NODE입니다.

Build → Add build step → Execute Windows batch command를 선택하고, Command 항목에는 아래의 명령을 입력합니다. 샘플 테스트 스크립트인 네이버 검색을 수행하는 명령입니다. <작업 폴더>/TESTCASE 폴더는 본인의 환경에 맞게 수정하세요.

cmd /c C:\GUITAR\BIN\guitar.exe E:\TESTCASE\SAMPLE\01_네이버검색\01_네이버검색.txt /TESTID:%BUILD_ID% /XMLPATH:%WORKSPACE% /REMOTE

빌드 후 조치 → 빌드 후 조치 추가 → Publish JUnit test result report를 선택하고, Test report XMLs 항목은 비워 두거나 report.xml을 입력합니다.

저장 버튼을 클릭하여 설정을 저장합니다.

  Jenkins에서 테스트 수행

GUITAR_TEST 프로젝트 화면에서 Build Now 버튼을 클릭하여 테스트를 수행합니다. VM2에서 Slave Node가 실행 중이고 이 Node에서 배치 명령이 실행되도록 프로젝트가 구성되었기 때문에, VM2에서 GUITAR 테스트가 수행됩니다.

수행결과는 테스트 서버와 공유한 VM2 리포트 폴더에 저장됩니다.

테스트 서버는 이 리포트 폴더를 웹으로 서비스하기 때문에 Jenkins 대시보드에 추가한 링크를 이용하면 테스트 결과 리포트를 볼 수 있습니다.


EOF


신고

외부 Jenkins와 내부 네트워크 상의 GUITAR 테스트 환경 연동 1

이 글에서는 퍼블릭 IP를 가지고 외부에 설치된 Jenkins와 내부 네트워크의 Windows 랩탑에서 실행되는 GUITAR 테스트의 연동 방법에 대해서 다룹니다.
GUITAR 2.0.0.12 버전의 사용자 가이드에서 제시하는 내용을 실무에 적용한 경험을 정리했다고 보시면 됩니다. 따라서 부족한 부분은 GUITAR 사용자 가이드로 보충하면 되겠습니다.

  랩탑 설정

랩탑에는 톰캣과 VitualBox를 설치합니다.
톰캣은 Jenkins와 연동하여 각 테스트 환경(VM)의 테스트 리포트를 보여주기 위한 용도이며, VirtualBox는 실제 테스트를 수행하거나 테스트 스크립트를 작성할 VM을 운용하기 위해서 필요합니다.

  VirtualBox 설치 및 설정

VirtualBox를 다운로드 한 후 설치합니다. VirtualBox Extension Pack도 꼭 같이 설치해 주세요.
https://www.virtualbox.org/wiki/Downloads

GUITAR 테스트를 작성 및 수행할 OS를 기반으로 가상 머신(VM)을 2개 만듭니다. Windows 7을 추천합니다.

랩탑의 적당한 위치에 아래의 폴더를 만듭니다.

  • GUITAR_DATA - 모든 VM이 공유하는 GUITAR 작업 폴더
  • GUITAR_REPORT1 - VM1의 리포트 공유 폴더
  • GUITAR_REPORT2 - VM2의 리포트 공유 폴더

VM1은 테스트 작성용, 다른 하나(VM2)는 테스트 수행용이지만 테스트 서버에서 리포트를 보기 편하도록 각 VM의 REPORT 폴더를 테스트 서버(랩탑)와 공유하도록 설정하려고 합니다.

VirtualBox 관리자에서 VM2를 선택하고 설정(S) 메뉴를 클릭합니다.

공유 폴더를 클릭한 후 + 기호가 있는 공유 추가 버튼을 클릭하여 위에서 생성한 GUITAR_REPORT2의 경로를 폴더 경로에 입력하고 자동 마운트(A) 옵션을 체크하고 저장합니다.

마찬가지 요령으로 공유 작업 폴더를 추가하고, VM1에도 동일하게 공유 폴더를 추가합니다.

VM2에서 파일 탐색기를 띄워서 확인해 보면, 위에서 추가한 공유 폴더가 각각 E:\F:\ 드라이브로 매핑된 것을 볼 수 있습니다.


이제 각 VM에 GUITAR를 설치합니다.

VM2에는 Jenkins 연동을 위해서 추가로 Java SDK를 설치합니다.
랩탑에서 다운로드 한 후 공유 폴더를 이용해서 각 VM에서 설치토록 하면 편합니다.

각 VM에서 C:\GUITAR\BIN\guitar.ini을 편집기로 열고 리포트 폴더의 위치를 리포트 공유 폴더 위치로 변경합니다. Path = ..\Report 문자열을 검색한 후 공유 폴더 위치로 값(..\Report)을 변경하면 됩니다. 저는 F:\로 변경했습니다.

[REPORT]
AreaCaptureView = 세로
FullSizeImage = False
TestServerName =
OpenReport = True
OpenDashboardReport = False
LimitCount=100
;Path = ..\Report
Path = F:\
DashboardHost = http://localhost:8080
XMLReport = False

마찬가지로 작업 폴더의 위치도 랩탑과 공유한 작업 폴더 위치로 변경합니다. WorkPath = 문자열을 검색한 후 값을 변경하면 됩니다. 저는 E:\로 변경했습니다.

[SCRIPT]
;WorkPath = C:\GUITAR\DATA
WorkPath = E:\
;SVNPath = https://dev.naver.com/svn/guitar/xxxxx/branches/yyyyyy
PreLoadScript = 공용변수.txt
TemplateScript = 기본템플릿.txt
;PreRun ="%BINPATH%\gitpull.bat" %WorkPath%

마지막으로 VM1의 C:\GUITAR\DATA 폴더의 내용물을 공유 작업 폴더로 모두 옮겨 주고, 각 VM의 C:\GUITAR\Report 폴더의 내용물을 각각의 공유 폴더로 모두 옮겨줍니다.
작업 폴더는 모든 VM이 공유하기 때문에 VM1에서만 옮기면 모두가 공유합니다. 리포트 폴더에는 우리가 연동을 위해 사용할 스크립트와 실행 파일 등이 있기 때문에 옮겨줄 필요가 있습니다.

  Tomcat 설치

랩탑에 톰캣을 다운로드 한 후 적당한 곳에 설치합니다.
http://tomcat.apache.org/download-60.cgi

%TOMCAT_HOME%/conf/Catalina/localhost 폴더를 생성하고, 다시 ROOT.xml 파일을 아래 내용으로 생성합니다. docBase 속성의 값은 위에서 생성한 GUITAR_REPORT2 폴더의 경로입니다. 저는 F:/GUITAR_REPORT2로 넣었습니다.

<Context path="/" docBase="F:/GUITAR_REPORT2" reloadable="true"/>

URIEncoding 오류를 방지하기 위해서 아래와 같이 %TOMCAT_HOME%/conf/server.xml 파일의 8080 포트 커넥터 설정을 변경합니다.

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           edirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true" />

톰캣을 실행한 후 VM2의 GUITAR 리포트 주소 (http://<랩탑의 내부 아이피>:8080/report.htm)로 접속하여 연동이 잘 됐는지 확인합니다.

너무 길어져서 다음 글에서 이어 가겠습니다.


EOF

신고