Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

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

문서설명

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

vagrant 와 가상화 프로그램(virtualbox)를 이용하여 OS 설치 및 각종 테스팅 작업을 편리하게 할 수 있다.

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

Virtualbox 설치

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

https://www.virtualbox.org/  설치.

  • 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관련한 저장소를 추가한 후 설치하는 것이 편리함.

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


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


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

Vagrant 설치 및 사용

https://www.vagrantup.com/

https://www.vagrantup.com/downloads 에서 필요한 OS에 맞는 것 설치

https://docs.vagrantup.com/v2/  에 문서가 잘 나와있음

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

윈도우용 ssh 프로그램 설치

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

윈도우10에서는 설치 후 재배부팅을 하고 나서 경로에 대한 설정을 해주지 않아도 vagrant 실행이 잘 되었음.

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

vagrant 설치

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

https://docs.vagrantup.com/v2/

 Vagrant global state 정보를 저장하는 VAGRANT_HOME 변수를 변경할 수 있으며 기본값은  ~/.vagrant.d 이다. boxes 등을 이 디렉토리에 저장을 하기 때문에 디스크 용량을 많이 차지할 가능성이 많다. 

이 부분을 윈도우에서 변경을 하려면 C:\users\yourusername 의 .bashprofile 에 다음의 내용을 넣어주면 된다. https://www.vagrantup.com/docs/other/environmental-variables.html  참고.

setx VAGRANT_HOME "D:/.vagrant.d"

vagrant 사용

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

$ vagrant init ubuntu/focal64

가상머신 시작하고 ssh로 로그인 하기

$ vagrant up
$ vagrant ssh

가상머신 삭제하기

$ vagrant destroy


vagrant init 을 실행한 로컬 PC에 생성된 Vagrantfile 파일 내용 확인

$ cat  Vagrantfile


vagrant 명령어 사용

# vagrant box 추가 (어느 경로에서 실행을 해도 상관없음)
$ vagrant box add ubuntu/focal64

# 홈디렉토리의 .vagrant.d/boxes 디렉토리에 해당 box 명으로 이미지가 만들어진다.
$ ls ~/.vagrant.d/boxes/

# box 목록 확인
$ vagrant box list
ubuntu/focal64 (virtualbox, 20210413.0.0)

# vagrant 프로젝트 디렉토리 생성. 파일 관리를 편리하게 하기 위한 것임. 
필수는 아니나 디렉토리를 잘 관리하는게 편리함. 
vagrant init 를 하면 해당 디렉토리에 Vagrantfile 이 만들어지므로 이것을 참고하여 디렉토리 구조 만듬.
$ mkdir porject/test
$ cd project/test

# vagrant instance 생성 (이 과정에서 설정파일인 Vagrantfile 이 만들어짐)
$ vagrant init ubuntu/focal64

# vagrant instance 시작하기(부팅)
$ vagrant up

# ssh 접속하기. vagrant ssh 로 접속시에는 비밀번호 없이 자동접속 가능함. 
# 또는 host 127.0.0.1 ,port 2222, username vagrant 로 설정을 하여 putty 등에서도 접속을 할 수도 있음.
$ vagrant ssh

# vagrant VM shutdown
$ vagrant halt

# vagrant box 없애기
$ vagrant destroy

# 새로운 vagrant box 생성하기
$ vagrant up

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

vagrant 설정 변경하기

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

Vagrant 주요 옵션

vm.box : 사용할 이미지

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

vm.network "private_network" : VM에 ip 지정

vm.provision : 특정 명령어 실행, 스크립트 실행 등

vm.hostname : hostname 설정

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 을 실행하면 프로비저닝이 가능하다.

shell 을 이용하여 프로비저닝하는 것이 가능하며 inline 을 이용 원하는 스크립트를 실행할 수 있다.

https://docs.vagrantup.com/v2/provisioning/shell.html

$ 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 파일을 변경하는 예이다.

$ vim Vagrantfile
 config.vm.provision "shell", inline: "yum install -y puppet"
 config.vm.provision :puppet do |puppet|
   puppet.manifests_path = "manifests"
   puppet.manifest_file  = "site.pp"
 end
$ mkdir manifests
$ cd manifests
$ vim site.pp
File { owner => 0, group => 0, mode => 0644 }
file { '/etc/motd':
  content => "Welcome to your Vagrant-built virtual machine!
              Managed by Puppet.\n"
}
$ vagrant up

https://docs.vagrantup.com/v2/getting-started/provisioning.html  문서를 보면 위와 같이 puppet 을 따로 지정하지 않고 초기 시작하는 스크립트를 bootstrap.sh 로 지정하고 사용을 하고 있다.

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

vagrant provisioning - Ansible

Vagrant + ansible 조합하기

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


먼저 실행이 되는 ansible playbook을 만들어서 확인을 해봄. Vagrantfile 파일이 있는 디렉토리에 소스를 두었음.

# tree ansible/
ansible/
├── init
│   └── tasks
│       └── main.yml
└── playbook.yml

2 directories, 2 files
# cat ansible/playbook.yml
---
- hosts: localhost
  roles:
    - init

# cat ansible/init/tasks/main.yml
---
- name: Make app directory
  file: path=/tmp/var/www state=directory mode=0755
  

Vagrantfile 에 다음과 같이 추가

ubuntu에 ansible 설치하고 playbook 실행함. Vagrantfile 있는 디렉토리를 VM에서 /vagrant 에 마운트함.

  config.vm.provision "shell", inline: <<-SHELL
    dpkg -l ansible > /dev/null || sudo apt-get update
    dpkg -l ansible > /dev/null || sudo apt-get install software-properties-common
    dpkg -l ansible > /dev/null || sudo apt-add-repository --yes --update ppa:ansible/ansible
    dpkg -l ansible > /dev/null || sudo apt-get install ansible --yes
    sudo ansible-playbook /vagrant/ansible/playbook.yml
  SHELL

  config.vm.synced_folder ".", "/vagrant"

vagrant 에서 확인

➜  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에 접근할 수 있다.

config.vm.network :forwarded_port, guest: 80, host: 4567

VM이 활성화 되어 있는 상태에서 네트워크 설정을 변경하고 반영하려면 vagrant reload를 해야 한다.

네트워크 설정을 변경하고나서 웹브라우저에서 curl http://127.0.0.1:4567 로 확인을 해본다.


Vagrant 에서 개발환경을 쉽게 공유하고 협업할 수 있도록 하는 것은 Vagrant Share 이다. Vagrant Share는 인터넷 연결을 통해 Vagrant 환경을 전 세계 모든 사람과 공유할 수 있는 플러그인입니다. 인터넷에 연결된 전 세계의 모든 장치에서 Vagrant 환경으로 직접 라우팅되는 URL을 제공합니다.

경고: Vagrant Share 서비스는 프로덕션 수준의 트래픽을 처리하도록 설계되지 않았습니다. 프로덕션 콘텐츠가 아닌 개발 또는 Q/A 환경만 공유 합니다

사전에 ngrok이 필요합니다. ngrok이 없으면 설치 설명서에 따라 설치하십시오. (mac에서 brew 로 설치 가능)

vagrant-share 플러그인 설치

$ vagrant plugin install vagrant-share
$ vagrant share
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or address to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:
    default: Local HTTP port: 4567
    default: Local HTTPS port: disabled
    default: Port: 2222
    default: Port: 4567
==> default: Creating Vagrant Share session...
==> default: HTTP URL: http://5292-119-206-125-157.ngrok.io
==> default:

이제 인터넷이 연결된 어느 곳에서나 ngrok 에서 제공하는 url을 이용하여 확인이 가능합니다.

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

여러 개의 VM  만들기

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

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo Hello"

  config.vm.define "web" do |web|
    web.vm.box = "ubuntu/focal64"
  end

  config.vm.define "db" do |db|
    db.vm.box = "ubuntu/focal64"
  end
end

JSON Configuration File 에서 노드 정보 가져오기 : https://github.com/garystafford/foreman-vagrant/blob/master/Vagrantfile  파일을 보면 노드 정보를 nodes.json 파일에 따로 저장하고 있다. 때로는 이렇게 별도로 각 노드별 설정을 다르게 사용을 하면 편리한 경우가 있다. https://github.com/garystafford/foreman-vagrant/blob/master/nodes.json  예제를 보면 쉽게 이해할 수 있다.


그냥 Vagrant file을 편집해서 쓰는 예제는 https://github.com/ripienaar/mcollective-vagrant/blob/master/Vagrantfile  참고.


아래 예제는 여러 개의 VM을 만들고 bootstrap.sh 스크립트로 프로비전 하는 경우임.

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

플러그인 목록 : https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins

  • 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 에 다음의 설정 추가

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

vagrant 기타 기능

  • 폴더 공유하기

  • 자신만의 box 만들기

주의 및 참고사항

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

https://seven.centos.org/2016/08/updated-centos-vagrant-images-available-v1607-01/

  • 윈도우 host os 에서는 rsync 관련한 부분을 비활성화하지 않으면 에러가 남. 아래는 d 드라이브의 .vagrant.d/boxes 에 centos6 box image를 둔 경우임. 

$ cat /d/.vagrant.d/boxes/centos-VAGRANTSLASH-6/1609.01/virtualbox/Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.base_mac = "525400df9f8b"
  #config.vm.synced_folder ".", "/vagrant", type: "rsync"
end
  • 윈도우에 WSL2(https://docs.microsoft.com/ko-kr/windows/wsl/install-win10 ) 설치한후에 vagrant 실행 시 ssh 접속 이 안됨. 이 부분은 네트워크 관련한 영향인듯 하며 확인 필요.

  • MacOS환경에서 VirtualBox 사용시 “kernel driver not installed” error가 발생할 수 있음.

  • 이때 시스템 환경설정 → 보안 및 개인 정보 보호로 가서 Oracle App을 허용해주면 됨.

  • vagrant vbguest plugin이 설치되어 있지 않을 경우 Vagrant가 VirtualBox 공유 폴더에 마운트 할 수 없다는 에러가 발생할 수 있음. 이 경우는 VBoxGuestAdditions에 대한 심볼릭 링크가 깨진 경우임.

# 플러그인 설치 전 (vagrant ssh)
lrwxrwxrwx 1 root root 49 Sep  3 00:58 /sbin/mount.vboxsf

# 플러그인 설치 
$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Fetching micromachine-3.0.0.gem
Fetching vagrant-vbguest-0.30.0.gem
$ vagrant reload

# 플러그인 설치 후 (vagrant ssh)
lrwxrwxrwx 1 root root 49 Sep  3 00:58 /sbin/mount.vboxsf -> /opt/VBoxGuestAdditions-6.1.26/other/mount.vboxsf
  • box를 centos7로 설정했을 경우 커널 버전으로 인해 yum 사용시 /mnt mount 에러가 발생할 수 있음.

  • vagrant로 centos7을 설치할 경우 기본적으로 repository에서 제거된 이전 버전의 커널이 포함되어 있음. 즉, 종속성 해결을 위해 vbguest를 다운그레이드 하거나 vagrant-vbguest에서 제공하는 allow_kernel_upgrade옵션을 사용하면 됨.

# 다운그레이드 방식
$ vagrant plugin uninstall vagrant-vbguest
$ vagrant plugin install vagrant-vbguest --plugin-version 0.21

# option 사용 방식
$ vi Vagrantfile
config.vm.define "centos7" do |box|
  box.vm.box = "centos/7"
  box.vm.box_version = "2004.01"
  box.vbguest.installer_options = { allow_kernel_upgrade: true }
  ...
  • 특정 OS에서 rsync가 정상 작동하지 않는 것을 발견.

  • Redhat계열의 OS에서만 rsync가 동작하지 않는 줄 알았으나 추가 테스트를 통해 OS와 상관없이 발생하는 것을 확인

→ 같은 옵션으로 ubuntu와 centOS를 확인했으나 두 OS 전부 옵션 변경사항이 없음에도 실행여부가 바뀌었으며 실행되는 경우보다 실행되지 않는 경우가 더 많았음.

  • vagrantfile에서 rsync__auto를 true로 해주거나 명시하지 않으면 Observing을 통해 공유 폴더를 업데이트하게 되는데 위 같은 경우는 vagrant 시작 단계에서 rsync가 실행이 되지않아 공유 폴더가 동기화 되지 않음.

https://github.com/hashicorp/vagrant/issues/10002

  • 해결책으로 cli를 통해 수동으로 rsync를 실행시켜주면 되며 vagrantfile에서 생명주기 trigger를 통해 자동으로 실행되게 설정 가능.

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

참고자료


  • No labels