티스토리 뷰


Vagrant 개요

Vagrant는 로컬 환경에서 가상화 관리를 가능하게 해주는 훌륭한 도구이다.
특히 도커와 가상화 환경을 로컬에서 시험하고, 프로덕션으로 넘길 때 유사한 환경을 만들어 줄 수 있다.
최근에는 DevOps 도구로 크게 주목받고 있으며, 가상화를 제어하는 메타프로파일은 Ruby언어로 구성되어 있다.
Vagrant 를 사용하기 위해서는 반드시 가상화 도구들이 필요하다.
가상화 도구를 설치하게 되면, Hypervisor Mode2 즉 Parents OS에 가상화 도구를 설치한 이후에 구성하는 방식으로 동작한다.
해당 운영체제는 리눅스, 맥OS, 윈도우 등 대부분의 운영체제를 지원한다.
가상화 도구는 Virtual Box, VMware 솔루션, HyperV 등 대부분의 가상화 도구를 지원한다.
Vagrant는 무료로 공개된 소프트웨어이며, 웹상에서 손쉽게 다운로드 받을 수 있다.
본 웹페이지에서는 Vagrant와 더불어 공개 가상화 도구로 사용되는 Virtual Box를 기반으로 사용방법을 소개한다.


위의 그림 아키텍쳐를 이해하면 조금더 이해가 쉽다.

구성요소
1. 하드웨어
 - 하드웨어는 물리적인 PC, 서버위에서 설치 구동이 가능하며, VM에서도 구성할 수 있다.
- 즉 Hypervisor Mode 1,2 모두 제약이 없다는 의미이다.

2.운영체제
- 운영체제에도 큰 제약이 없다.
- 맥, 윈도우, 리눅스 모두에서 동작하며, 하이퍼바이져를 기반으로 한다면 VMware, KVM, HyperV 모두 사용이 가능하다.

3.Vagrant
- Vagrant를 설치하게 되면, 실제 역할은 마치 프로비져닝을 담당하는 도구로 동작한다. 가상화 도구인 Virtual Box, VMware Workstation/Fusion , HyperV등을 제어하여 일괄 배포하는 역할이다.
- Vagrant의 핵심은 Vagrantfile이 핵심역할을 하게 되며, 언어는 Ruby로 구성된다.
- Vagrantfile은 다중으로 구성하거나, 단일에서 멀티환경을 구성 배포할 수 있을 정도로 강력하다.

4.Image
- Vagrant와 연동되는 이미지는 Vagrant Cloud에서 다운로드 받을 수 있으며 다양한 용도의 이미지가 사전에 패키징 되어 있다.
- Provisioning을 위해서는 Vagrantfile이 사전에 정의되거나 동적으로 생성된다.

5.가상화 도구 (e.g Virtual Box)
- Virtual Box로 예를 들면, Vagrantfile에서 정의된 이미지와 가상화 도구인 Virtual Box를 선택하면 경로를 찾아서 자동으로 설치하는 방식이다.
- Virtual Box 에 구성 컴포넌트를 Vagrantfile을 통해 가상화 이미지, 구성설정, 자원을 자동으로 배포할 수 있다.


Virtual Box 설치

Viitual Box Site 접속 후 Mac용 또는 Window용 프로그램 다운로드 및 설치를 진행한다.
앞서 소개한 것 처럼 Vagrant를 구성하기 위한 필수요소이며, Virtual Box는 무료이다.
Mac 사용자의 경우 보안설정으로 설치가 불가능하므로, “시스템 환경설정” - “보안 및 개인정보보호” 에서 Virtual Box를 사용할 수 있도록 해제해주면 정상 설치가 가능하다.

아래 사이트에서 접속이 가능하다 - Virtual Box 




[ Vagrant 설치와 구성]

자신의 운영체제에 적합한 Vagrant를 웹사이트에 접속한다. 
아래 사이트에서 다운로드가 가능하다 - Vagrant Web Site





설치가 완료되면 Terminal에서 정상적으로 동작하는지를 확인한다.

➜  ~ vagrant version
Installed Version: 2.2.4
Latest Version: 2.2.4

You're running an up-to-date version of Vagrant!

Vagrant는 가상화 솔루션을 제어하고 , 형상관리만을 지원하므로 가상화 기반에서 구동하게 되는 Vagrant Image를 설치해야 한다.
Vagrant용 다양한 이미지들은 Vagrant Cloud에서 접속해서 다운로드 받을 수 있다. (Vagrant Cloud WebSite)
여기서 소개는 CentOS 7 과 Ubuntu설치를 소개한다.
CentOS는    centos/7, Ubuntu는 bento/ubuntu-16.04를 설치한다.
설치방법은 직접 다운로드를 웹상에서 받는 방법과 콘솔에서 다운로드를 받아서 설치하는 방법이 있다.



콘솔에서는 vagrant 명령을 통해 설치한다.
앞서 소개한 vagrant cloud에서 인벤토리 목록을 입력하면, 콘솔에서 바로 실행된다.
설치 방법은 이외에도 뒤에서 소개되는 Ruby 로 코딩된 Vagrantfile 이라는 파일을 수정하여 실행해도 된다.
➜  ~ vagrant init centos/7
==> box: Loading metadata for box 'centos/7'
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop

Enter your choice: 3
==> box: Adding box 'centos/7' (v1902.01) for provider: virtualbox
    box: Download redirected to host: cloud.centos.org
==> box: Successfully added box 'centos/7' (v1902.01) for 'virtualbox!

➜  ~ vagrant box list
centos/7 (virtualbox, 1902.01)
➜  ~ vagrant up
이와 같이 구성하면, CentOS 기반의 리눅스가 간단하게 맥북에서 동작한다.


[Vagrant 명령 소개]

Vagrant  기반으로 자신의 환경을 구축하고, 시험하기 위해서는 몇가지 필수 명령어를 익혀 둘 필요가 있다.
자주 사용되는 명령어를 아래와 같이 요약하였다.
상세한 내용은 Vagrant Web 페이지를 참조하면 된다. ( Vagrant CLI )

VM 생성 및 구동

vagrant -v
설치 후 버전확인
vagrant init <boxpath>
vm 생성
vagrant up
vagrant 실행
vagrant resume
VM suspend
vagrant provision
강제로 reprovision
vagrant reload
vagrant VM 재구동
vagrant status
vagrant VM 상태 확인
VM 접속 및 정지, 삭제
vagrant ssh
vagrant ssh 접속
(VM이 1대일 경우 box name 필요없음)
vagrant ssh <boxname>
ssh접속하기 위한 box name
vagrant halt <boxname>
VM 셧다운
vagrant suspend <boxname>
VM suspend
vagrant destroy
VM 삭제
vagrant destroy -f
VM 강제 삭제
Box 관련 명령
vagrant box list
Box에 설치된 이미지 목록
vagrant box add <name> <url>
vm 생성
vagrant box remove <name>
Box 이미지 삭제


[Vagrantfile 최적화]

Vagrant의 핵심이라고 할 수 있는 부분이다.
Vagrant를 사용할 때, 주로 멀티 VM을 사용하는 경우가 많다.
예를 들면 2/3Tier 시험을 하거나, Ansible/Chef/Puppet과 같은 자동화 도구 시험 등 여러개의 VM을 구성해서 사용하는 경우가 많다.
이럴 때는 반드시 Vagrantfile을 수정해서 작성해야 한다.
Vagrantfile은 최초 설치시 자신의 Homedirectory에 설정이 되며, 필요에 따라서 여러개의 Vagrantfile을 만들수도 있다.
이번 예제에서는 ~/vagrant/centos7/Vagrantfile, ~/vagrant/ubunt16/Vagrantfile 두개의 위치에서 각각의 OS 4개씩 구성하는 예제를 소개한다.

CentOS7 용 Vagrantfile 용 Ruby

Vagrant.configure("2") do |config|

    # All servers will run cent 7
    config.vm.box = "centos/7"
    config.vm.box_check_update = true

    # Create the cent1 Server
    config.vm.define "cent1" do |cent1|
        cent1.vm.hostname = "cent1"
        cent1.vm.network "private_network", ip: "192.168.2.11"
        cent1.vm.provider "virtualbox" do |v|
            v.name = "cent1"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end

        cent1.vm.provision "shell", inline: <<-SHELL
          sudo yum -y update
          sudo yum -y install net-tools
        SHELL
    end

    # Create the cent2 Server
    config.vm.define "cent2" do |cent2|
        cent2.vm.hostname = "cent2"
        cent2.vm.network "private_network", ip: "192.168.2.12"
        cent2.vm.provider "virtualbox" do |v|
            v.name = "cent2"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end

        cent2.vm.provision "shell", inline: <<-SHELL
          sudo yum -y update
          sudo yum -y install net-tools
        SHELL
    end

    # Create the cent3 Server
    config.vm.define "cent3" do |cent3|
        cent3.vm.hostname = "cent3"
        cent3.vm.network "private_network", ip: "192.168.2.13"
        cent3.vm.provider "virtualbox" do |v|
            v.name = "cent3"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end

        cent3.vm.provision "shell", inline: <<-SHELL
          sudo yum -y update
          sudo yum -y install net-tools
        SHELL
    end

    # Create the cent4 Server
    config.vm.define "cent4" do |cent4|
        cent4.vm.hostname = "cent4"
        cent4.vm.network "private_network", ip: "192.168.2.14"
        cent4.vm.provider "virtualbox" do |v|
            v.name = "cent4"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end

        cent4.vm.provision "shell", inline: <<-SHELL
          sudo yum -y update
          sudo yum -y install net-tools
        SHELL
    end

end

# CentOS7 VM을 4개 구성한다.
# 각VM들에 개별 호스트명을 부여하고, IP 주소도 개별로 할당한다.
# VM들에 대한 자원 할당을 사전에 선언하여 메모리 크기와 CPU할당 크기를 선언해 준다.
# linked_clone을 구성하여 디스크 사용의 최적화를 구현한다.
# VM 생성과 배포시 사전에 yum update와 net-tools를 설치한다.
반나절 정도 고생을 좀 했는데, 맥북에 VM을 배포하면 팬이 미친듯이 돌아간다는 것이었다.
결국 튜닝 끝에 발견한 것은 CPU,Memory문제 보다 Thick Provisioning으로 배포 될 경우 디스크 IO가 증가하면서 맥북이 미치는 것이었다.
Vagrantfile에서 VirtualBox 배포시 제공하는 Linked Clone을 선언하여, Thin Provisioning으로 적용시 매우 안정적으로 동작하는 것을 확인하였다.
맥북 사용자들은 꼭 참고하기 바란다.

Ubuntu16 LTS용 Vagrantfile 용 Ruby
Vagrant.configure("2") do |config|

    # All servers will run Ubuntu 16.04
    config.vm.box = "bento/ubuntu-16.04"
    config.vm.box_check_update = true

    # Create the ubuntu1 Server
    config.vm.define "ubuntu1" do |ubuntu1|
        ubuntu1.vm.hostname = "ubuntu1"
        ubuntu1.vm.network "private_network", ip: "192.168.1.11"
        ubuntu1.vm.provider "virtualbox" do |v|
            v.name = "ubuntu1"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end

        ubuntu1.vm.provision "shell", inline: <<-SHELL
          sudo apt update
          sudo apt upgrade -y
        SHELL
    end

    # Create the ubuntu2 Server
    config.vm.define "ubuntu2" do |ubuntu2|
        ubuntu2.vm.hostname = "ubuntu2"
        ubuntu2.vm.network "private_network", ip: "192.168.1.12"
        ubuntu2.vm.provider "virtualbox" do |v|
            v.name = "ubuntu2"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end

        ubuntu2.vm.provision "shell", inline: <<-SHELL
          sudo apt update
          sudo apt upgrade -y
        SHELL
    end

    # Create the ubuntu3 Server
    config.vm.define "ubuntu3" do |ubuntu3|
        ubuntu3.vm.hostname = "ubuntu3"
        ubuntu3.vm.network "private_network", ip: "192.168.1.13"
        ubuntu3.vm.provider "virtualbox" do |v|
            v.name = "ubuntu3"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end

        ubuntu3.vm.provision "shell", inline: <<-SHELL
          sudo apt update
          sudo apt upgrade -y
        SHELL
    end

# Create the ubuntu4 Server
    config.vm.define "ubuntu4" do |ubuntu4|
        ubuntu4.vm.hostname = "ubuntu4"
        ubuntu4.vm.network "private_network", ip: "192.168.1.14"
        ubuntu4.vm.provider "virtualbox" do |v|
            v.name = "ubuntu4"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end

        ubuntu4.vm.provision "shell", inline: <<-SHELL
          sudo apt update
          sudo apt upgrade -y
        SHELL
    end

end

# CentOS7 VM을 4개 구성한다.
# 각VM들에 개별 호스트명을 부여하고, IP 주소도 개별로 할당한다.
# VM들에 대한 자원 할당을 사전에 선언하여 메모리 크기와 CPU할당 크기를 선언해 준다.
# linked_clone을 구성하여 디스크 사용의 최적화를 구현한다.
# VM 생성과 배포시 사전에 yum update와 net-tools를 설치한다.


[멀티VM 배포 과정]
vagrant destroy
    cent4: Are you sure you want to destroy the 'cent4' VM? [y/N]
==> cent4: Forcing shutdown of VM...
==> cent4: Destroying VM and associated drives

# 생성되어 있던 모든 VM을 삭제
# -f 옵션을 선언하면 강제로 삭제.

vagrant box list
bento/ubuntu-16.04 (virtualbox, 201812.27.0)
centos/7           (virtualbox, 1902.01)

# 현재 생성되어 있는 이미지 리스트 확인

vagrant box remove bento/ubuntu-16.04
Removing box 'bento/ubuntu-16.04' (v201812.27.0) with provider 'virtualbox’…

# 현재 생성되어 있는 이미지를 삭제

vagrant up
Bringing machine 'cent1' up with 'virtualbox' provider...
Bringing machine 'cent2' up with 'virtualbox' provider...
Bringing machine 'cent3' up with 'virtualbox' provider...
Bringing machine 'cent4' up with 'virtualbox' provider
중략..

# 해당디렉토리에서 vagrant를 실행시켜, centos7 vm들을 생성

 vagrant up
Bringing machine 'ubuntu1' up with 'virtualbox' provider...
Bringing machine 'ubuntu2' up with 'virtualbox' provider...
Bringing machine 'ubuntu3' up with 'virtualbox' provider...
Bringing machine 'ubuntu4' up with 'virtualbox' provider
중략

# 해당 디렉토리에서 vagrant를 실행시켜, ubuntu16 vm들을 생성

vagrant ssh cent1

# Vagrantfile에서 설정한 hostname으로 접속

[vagrant@cent1 ~]$ cat /etc/*release*
CentOS Linux release 7.6.1810 (Core)
Derived from Red Hat Enterprise Linux 7.6 (Source)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.6.1810 (Core)
CentOS Linux release 7.6.1810 (Core)
cpe:/o:centos:centos:7

[root@cent1 vagrant]# ifconfig | awk '/192/'
        inet 192.168.2.11  netmask 255.255.255.0  broadcast 192.168.2.255

# 정상적으로 설치된 것을 확인할 수 있다.

root@cent1 vagrant]# ping 192.168.2.12
PING 192.168.2.12 (192.168.2.12) 56(84) bytes of data.
64 bytes from 192.168.2.12: icmp_seq=1 ttl=64 time=0.415 ms

# 생성된 다른 호스트로 정상적으로 네트워크 연결을 확인 할 수 있다.

ssh vagrant@192.168.1.12
The authenticity of host '192.168.1.12 (192.168.1.12)' can't be established.
ECDSA key fingerprint is SHA256:1Z76nTl7aEpVhcnFIanMDmBiVXrhL9SXkGVxN7LcLD0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.12' (ECDSA) to the list of known hosts.
vagrant@192.168.1.12's password:
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-131-generic x86_64)

* Documentation:  https://help.ubuntu.com
* Management:     https://landscape.canonical.com
* Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.


*** System restart required ***
vagrant@ubuntu2:~$

# 다른 호스트로 ssh가 정상 접속되는 것도 확인 할 수 있다.


[Virtual Box 확인]

Vgrantfile을 통해 8대 가상머신을 배포한 이후, Vagrantfile에서 선언한 것 처럼 자원이 할당된 것을 볼 수 있다.
또한 linked Clone기반의 Thin Provisioning으로 배포했기 때문에, 마스터 VM이 각 1개씩 설치된 것을 확인할 수 있다.





공지사항