Table of Contents | ||||
---|---|---|---|---|
|
Note |
---|
Oracle VirtualBox 본팩은 무료이나, 확장팩의 경우 유료입니다. Extension Pack은 회사의 컴퓨터에 설치하면 안됩니다. |
문서설명
Vagrant는 단일 워크 플로에서 가상 머신 환경을 구축하고 관리하기위한 도구이다.
...
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관련한 저장소를 추가한 후 설치하는 것이 편리함.
|
네트워크 구성을 NAT 로 설정을 함.
Windows 의 경우 다른 드라이브에 VM을 두려고 할 경우 파일 - 환경설정 - 일반에서 기본 머신 폴더를 변경을 하면 됨. 안 그러면 C 드라이브가 꽉 참.
Vagrant 설치 및 사용
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 참고.
|
vagrant 사용
Vagrant 초기화. 여기에서 지정한 이미지가 로컬 pc에 없으면 자동으로 https://app.vagrantup.com/boxes/search 에서 찾아 다운로드를 받는다. 사전에 만들어놓은 VM을 가져와서 사용하는 것임.
Code Block |
---|
$ vagrant init ubuntu/focal64 |
가상머신 시작하고 ssh로 로그인 하기
Code Block |
---|
$ vagrant up
$ vagrant ssh |
가상머신 삭제하기
Code Block |
---|
$ vagrant destroy |
vagrant init
을 실행한 로컬 PC에 생성된 Vagrantfile 파일 내용 확인
Code Block |
---|
$ cat Vagrantfile |
vagrant 명령어 사용
|
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 설정
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 을 실행하면 프로비저닝이 가능하다.
shell 을 이용하여 프로비저닝하는 것이 가능하며 inline 을 이용 원하는 스크립트를 실행할 수 있다.
https://docs.vagrantup.com/v2/provisioning/shell.html
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 파일을 변경하는 예이다.
|
https://docs.vagrantup.com/v2/getting-started/provisioning.html 문서를 보면 위와 같이 puppet 을 따로 지정하지 않고 초기 시작하는 스크립트를 bootstrap.sh 로 지정하고 사용을 하고 있다.
Vagrantfile 파일은 동일하게 유지하고 프로비저닝 부분만 따로 스크립트로 관리하는 것이 더 편리할 것 같다.
vagrant provisioning - Ansible
Vagrant + ansible 조합하기
Vagrant 에서 ansible 직접 지원하는 구문이 있을 건데 아무튼 아래와 같이 작동은 함.
...
먼저 실행이 되는 ansible playbook을 만들어서 확인을 해봄. Vagrantfile 파일이 있는 디렉토리에 소스를 두었음.
Code Block |
---|
# 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 에 마운트함.
Code Block |
---|
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 에서 확인
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 |
---|
config.vm.network :forwarded_port, guest: 80, host: 4567 |
VM이 활성화 되어 있는 상태에서 네트워크 설정을 변경하고 반영하려면 vagrant reload를 해야 한다.
...
Vagrant 에서 개발환경을 쉽게 공유하고 협업할 수 있도록 하는 것은 Vagrant Share 이다. Vagrant Share는 인터넷 연결을 통해 Vagrant 환경을 전 세계 모든 사람과 공유할 수 있는 플러그인입니다. 인터넷에 연결된 전 세계의 모든 장치에서 Vagrant 환경으로 직접 라우팅되는 URL을 제공합니다.
Note |
---|
경고: Vagrant Share 서비스는 프로덕션 수준의 트래픽을 처리하도록 설계되지 않았습니다. 프로덕션 콘텐츠가 아닌 개발 또는 Q/A 환경만 공유 합니다 |
사전에 ngrok이 필요합니다. ngrok이 없으면 설치 설명서에 따라 설치하십시오. (mac에서 brew 로 설치 가능)
vagrant-share 플러그인 설치
Code Block |
---|
$ 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을 이용하여 확인이 가능합니다.
Code Block |
---|
$ curl http://5292-119-206-125-157.ngrok.io |
여러 개의 VM 만들기
config.vm.define 이용하기 : https://www.vagrantup.com/docs/multi-machine/
|
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
스크립트로 프로비전 하는 경우임.
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
플러그인 목록 : 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 에 다음의 설정 추가
Code Block 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를 둔 경우임.
Code Block |
---|
$ 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에 대한 심볼릭 링크가 깨진 경우임.
Code Block |
---|
# 플러그인 설치 전 (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
옵션을 사용하면 됨.
Code Block |
---|
# 다운그레이드 방식
$ 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를 통해 자동으로 실행되게 설정 가능.
Code Block | ||
---|---|---|
| ||
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 |
참고자료
https://docs.vagrantup.com/v2/ 에서 소개하는 책은 Vagrant: Up and Running 이며 인터넷에서 다운로드 받을 수 있음.
https://learn.hashicorp.com/collections/vagrant/getting-started 에서 나온대로 실습