Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents
maxLevel7
minLevel1
Note

Oracle VirtualBox  본팩은 무료이나, 확장팩의 경우 유료입니다. Extension Pack은 회사의 컴퓨터에 설치하면 안됩니다.

문서설명

Vagrant는 단일 워크 플로에서 가상 머신 환경을 구축하고 관리하기위한 도구이다. 

...

Puppet , jenkins 등과 결합을 하여 프로비저닝, 설정관리, CI 테스트등을 위한 효율적인 환경 구성이 가능하다.

Virtualbox 설치

가상화 프로그램 설치 전 BIOS 에서 가상화 관련한 기능을 활성화 해야 함.

...

  • virtualbox 설치 후 환경설정-확장에서 Oracle VM VirtualBox Extension Pack 도 설치를 하는 것이 좋음. Support for USB 2.0 devices, VirtualBox RDP and PXE boot for Intel cards.

  • Oracle VM VirtualBox Extension Pack 설치시 root 권한이 필요하므로 sudo 로 Virtualbox 실행하여 UI에서 File-preference-Extensions 에서 설치하면 되됨. 설치 후에는 원하는 사용자로 실행하면됨.

    • → 회사에서 Extention Pack 설치하면 Oracle 에서 감사조치 날아옴.

  • Ubuntu 의 경우 https://www.virtualbox.org/wiki/Linux_Downloads  를 참고하여 /etc/apt/sources.list에 virtualbox관련한 저장소를 추가한 후 설치하는 것이 편리함.

Code Block
sudo apt-get update
sudo apt-get install virtualbox-4.3

네트워크 구성을 NAT 로 설정을 함.

Windows 의 경우 다른 드라이브에  VM을 두려고 할 경우 파일 - 환경설정 - 일반에서 기본 머신 폴더를 변경을 하면 됨. 안 그러면 C 드라이브가 꽉 참.

Vagrant 설치 및 사용

https://www.vagrantup.com/

...

Vagrant 실습은 https://learn.hashicorp.com/collections/vagrant/getting-started 이용하는 것이 좋음.

윈도우용 ssh 프로그램 설치

윈도우7 에서 설치 후 vagrant 명령어 실행시 virtualbox 를 찾지 못했음. PATH 환경변수에 virtualbox 경로를 추가해 주어야 함.

...

windows 의 경우 ssh 접속을 위해서 cygwin, minGW, Git 등의 SSH 클라이언트를 미리 설치해 두는 것이 좋음.  http://git-scm.com/  설치하면 GIT bash 가 있음.

vagrant 설치

https://www.vagrantup.com/  설치.

...

Code Block
setx VAGRANT_HOME "D:/.vagrant.d"

vagrant 사용

Vagrant 초기화. 여기에서 지정한 이미지가 로컬 pc에 없으면 자동으로 https://app.vagrantup.com/boxes/search 에서 찾아 다운로드를 받는다. 사전에 만들어놓은 VM을 가져와서 사용하는 것임.

...

git-bash 등의 커맨드라인에서 vagrant init 를 실행하면 현재의 디렉토리에서 작업을 하고 Vagrantfile 파일을 만든다. 그러므로 적절한 디렉토리로 이동을 해서 작업하는 것이 관리상 용이할 것 같다.

vagrant 설정 변경하기

vagrant init 를 하면 명령을 실행한 해당 디렉토리에 Vagrantfile 파일이 생긴다. 이 파일을 수정하면 vagrant up을 할 때 여러가지 작업을 조합할 수 있다.

Vagrant 주요 옵션

vm.box : 사용할 이미지

vm.network :forwarded_port : 호스트의 port를 VM gues의 지정 포트로 포워드

...

Code Block
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
  config.vm.network :forwarded_port, guest: 80, host: 4567
  config.vm.network "private_network", ip: "192.168.33.100"

#  config.vm.provision "shell", path: "test.sh"

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y nginx
    echo "test" > /var/www/html/index.html
  SHELL

  config.vm.hostname = 'www.example.com'
end

vagrant provisioning - shell

처음으로 vagrant up을 할 때 프로비저닝이 실행된다. 첫 가동 이후에는 vagrant up --provision 을 지정해서 가동하거나 가상 서버 가동 후에 vagrant provisoin 을 실행하면 프로비저닝이 가능하다.

...

Code Block
$ vim Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
   config.vm.provision "shell", inline: <<-SHELL
     apt-get update
     apt-get install -y apache2
   SHELL
end

$ vagrant provision

vagrant provisioning - Puppet

아래는 vagrant up 을 할 때 puppet 을 설치하고 puppet 을 통하여 /etc/motd 파일을 변경하는 예이다.

...

Vagrantfile 파일은 동일하게 유지하고 프로비저닝 부분만 따로 스크립트로 관리하는 것이 더 편리할 것 같다.

vagrant provisioning - Ansible

Vagrant + ansible 조합하기

Vagrant 에서 ansible 직접 지원하는 구문이 있을 건데 아무튼 아래와 같이 작동은 함.

...

Code Block
➜  vagrant_template git:(ansible) ✗ vagrant provision
==> default: Running provisioner: shell...
    default: Running: inline script
    default: [WARNING]: provided hosts list is empty, only localhost is available. Note that
    default: the implicit localhost does not match 'all'
    default:
    default: PLAY [localhost] ***************************************************************
    default:
    default: TASK [Gathering Facts] *********************************************************
    default: ok: [localhost]
    default:
    default: TASK [init : Make app directory] ***********************************************
    default: ok: [localhost]
    default:
    default: PLAY RECAP *********************************************************************
    default: localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

네트워크 설정 및 vagrant share 이용하여 환경 공유하기

포트 전달 구성(forwarded_port)을 하면 편리하게 VM의 특정 port에 접근할 수 있다.

...

Code Block
$ curl http://5292-119-206-125-157.ngrok.io

여러 개의 VM  만들기

config.vm.define 이용하기 : https://www.vagrantup.com/docs/multi-machine/

...

Code Block
DOMAIN="example.com"
# ubuntu 20.0.4
ubuntu_box="ubuntu/focal64"
common_bootstrap="bootstrap.sh"

Vagrant.configure(2) do |config|
  config.vm.define "ubuntu01" do |ubuntu|
    ubuntu.vm.box = "#{ubuntu_box}"
    ubuntu.vm.network "private_network", ip: "192.168.33.12"
    ubuntu.vm.hostname = "ubuntu01.#{DOMAIN}"
    ubuntu.vm.provision :shell, path: "#{common_bootstrap}"

    ubuntu.vm.provider "virtualbox" do |vb|
      vb.memory = "1024"
    end

  end
 
  config.vm.define "ubuntu02" do |ubuntu|
    ubuntu.vm.box = "#{ubuntu_box}"
    ubuntu.vm.network "private_network", ip: "192.168.33.13"
    ubuntu.vm.hostname = "ubuntu02.#{DOMAIN}"
    ubuntu.vm.provision :shell, path: "#{common_bootstrap}"
  end
end

Vagrant plugins

https://www.vagrantup.com/docs/cli/plugin.html

...

  • vagrant-vbguest :  automatically update VirtualBox guest additions if necessary . VirtualBox guest addions 을 업데이트해야 /vagrant 디렉토리 공유가 되는 경우가 있음. OS별로 좀 다른 듯 함.  auto_update, no_install 등의 옵션이 필요한 경우가 있음. 보통 auto_update 는 필요하지 않은 듯 한데 host os+guest os 에 따라서 설치안해도 되는 경우가 있음.

  • vagrant-hostmaner : /etc/hosts를 자동으로 설정해주는 기능인데 여러 개의 VM으로 테스팅을 하는 경우 유용함. 최소한 config.hostmanager.manage_host = true 옵션을 주어야 작동하였음. https://github.com/devopsgroup-io/vagrant-hostmanager

    • 설치 : $ vagrant plugin install vagrant-hostmanager

    • 사용 : Vagrantfile 에 다음의 설정 추가

    • Code Block
        config.hostmanager.manage_host = true
        config.vm.hostname = 'www.example.com'

vagrant 기타 기능

  • 폴더 공유하기

  • 자신만의 box 만들기

주의 및 참고사항

  • CentOS vagrant image 릴리즈한 것에 몇가지 조심해야 할 부분 있음. 

...

Code Block
languagebash
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "forwarded_port", guest: 80, host: 8081
  config.vm.network "public_network", ip: "192.168.0.2"

  # 이 부분 추가 
  # 수동으로 rsync를 실행시키면 인터럽트를 수신할 때까지 프로세스를 종료하지 않으므로 백그라운드로 실행
  config.trigger.after :up do |trigger|
    trigger.info = "rsync auto"
    trigger.run = {inline: "bash -c 'vagrant rsync-auto &'"}
  end
  
  config.vm.synced_folder ".", "/vagrant", type: "rsync"
end

참고자료

...