DevOps

Vagrant

ํด๋ผ์šฐ๋“œ์™€ ๋กœ์ปฌ์—์„œ VM์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฐ์ •์ ์ด๊ณ  ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•

  • #vm
  • #iac
  • #infra

Vagrant๋Š” ๊ฐ€์ƒ ๋จธ์‹ (VM) ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ์›๋ž˜ 2010๋…„ Hashicorp์˜ ์ฐฝ๋ฆฝ์ž์ธ ๋ฏธ์ฒผ ํ•˜์‹œ๋ชจํ† ๊ฐ€ ๊ฐœ์ธ์ ์ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋กœ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์ธ ์„ฑ๋ช…

ํ•œ๊ตญ์–ด ์‹ค๋ ฅ์ด ๋ถ€์ ํ•˜์—ฌ ์ด ๊ธ€์ด ๊ตฌ๊ธ€ ๋ฒˆ์—ญ๊ธฐ๋ฅผ ์ฃผ๋กœ ํ™œ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์ •ํ™•ํ•œ ๋ฌธ๋ฒ•๊ณผ ์–ดํœ˜๊ฐ€ ์žˆ์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฌ๋ฉฐ, ์ถ”ํ›„์— ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ œ๊ณต์ž

์ œ๊ณต์ž๋Š” Vagrant๊ฐ€ VM์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” Vagrant ์ œ๊ณต์ž ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒ์ž(Box)

Box๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” VM์˜ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. Vagrant์—๋Š” ๋ฐฐํฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ฆฌ์ž ๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋งŒ๋“  ๋‹ค์–‘ํ•œ ์ƒ์ž๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ์ž์ฒด ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์ž๋Š” Hashicorp Portal์„ ํ†ตํ•ด ๋ฐœ๊ฒฌ/ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฒŒ ์˜ˆ์‹œ ์ƒ์ž๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • centos/7
  • generic/gentoo
  • ubuntu/xenial64
  • hashicorp/precise64
  • archlinux/archlinux

Vagrantfile

Vagrantfile์€ Vagrant๊ฐ€ ๋ฐฐํฌ์— ์‚ฌ์šฉํ•˜๋Š” VM์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ตฌ์„ฑ์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ Ruby ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” VM์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉ๋  centos/7์„ ์ง€์ •ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ Vagrantfile์ž…๋‹ˆ๋‹ค.

Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
end

vagrant init centos/7๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ดˆ๋ณด์ž๊ฐ€ ์‚ดํŽด๋ณด๊ธฐ์— ์œ ์šฉํ•œ CentOS์šฉ Vagrantfile์„ ๋งŽ์ด ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์Šค์บํด๋”ฉํ•ฉ๋‹ˆ๋‹ค. Vagrantfile์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

Vagrantfile์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋ ค๋ฉด validate ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

vagrant validate

ํ”„๋กœ๋น„์ €๋„ˆ(Provisioner)

ํ”„๋กœ๋น„์ €๋„ˆ๋Š” VM์ด โ€‹โ€‹์ƒ์„ฑ๋œ ํ›„ VM์„ ์„ค์ •ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋„๊ตฌ์™€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์€ ๋นˆ VM์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • Ansible
  • Puppet
  • Chef
  • Salt
  • Raw scripts (e.g Bash)

์…ธ ์ˆ˜ํฌ๋ฆฝํŠธ

์…ธ ํ”„๋กœ๋น„์ €๋‹ ๋ธ”๋ก์—์„œ๋Š” ์ƒ์„ฑ/ํŽธ์ง‘ ์‹œ ์‹คํ–‰๋˜๋Š” ์ธ๋ผ์ธ ์…ธ ๋ช…๋ น์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.provision "shell", inline: <<-SHELL
    echo hello from shell!
    sudo yum update -y
    sudo yum install -y httpd
  SHELL
end

๋˜๋Š”, Vagrantfile์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

provision.sh
#!/bin/bash

echo hello from shell!
sudo yum update -y
sudo yum install -y httpd

์ด provision.sh ์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋ ‡๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.provision "shell", path: "provision.sh"
end

์…ธ์„ ํ”„๋กœ๋น„์ €๋„ˆ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ฐฐ์šฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์—

Vagrantfile์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•œ ํ›„ vagrant up์„ ์‹คํ–‰ํ•˜์—ฌ VM์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ๋Š” VM์„ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋จผ์ € ๊ณต์‹ ์ €์žฅ์†Œ์—์„œ ์ง€์ •๋œ ์ƒ์ž(์ด๋ฏธ์ง€)๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

VM์ด ์ƒ์„ฑ๋˜๊ณ  ์‹คํ–‰๋˜๋ฉด vagrant ssh๋ฅผ ์‹คํ–‰ํ•˜์—ฌ VM์— ssh๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. SSH์—์„œ VM์„ ์ข…๋ฃŒํ•˜๋ ค๋ฉด ๋ช…๋ น์ค„์— exit๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. VM์„ ์ค‘์ง€ํ•˜๋ ค๋ฉด vagrant halt๋ฅผ ์‹คํ–‰ํ•˜์—ฌ VM์„ ์šฐ์•„ํ•˜๊ฒŒ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ช…๋ น

์ด ์„น์…˜์„ ๊ธฐ๋ณธํ•œ Vagrant CLI ๋ช…๋ น ๋ช‡ ๊ฐ€์ง€ ์•„๋ผ๋ณด๊ฒŒ์”๋‹ˆ๋‹ค.

Vagrant ๋ช…๋ น

๋ช…๋ น์„ค๋ช…์˜ˆ์‹œ
vagrant init์ƒˆ๋กœ์šด Vagrantfile๋ฅผ ๋งŒ๋“œ๋‹คvagrant init centos/7
vagrant upVM์„ ๋‹ค์šด๋กœ๋“œ ๋‹ค์Œ์— ์‹œ์ž‘ํ•˜๋‹ค
vagrant sshSSH๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VM์— ๋“ค์–ด๊ฐ€๊ธฐ
vagrant ssh-configOpenSSH ์œ ํšจ ๊ตฌ์„ฑ์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค
vagrant haltVM๋“ค ๋‹ค ๋ฉˆ์ถ”๋‹ค
vagrant suspendVM๋“ค์„ ์ผ์‹œ ์ค‘๋‹จํ•˜๋‹ค
vagrant resume์ค‘๋‹จ๋œ VM๋“ค์€ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋‹ค
vagrant reloadVM๋“ค ๋ฉˆ์ถ”๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋‹ค
vagrant destroy๋ชจ๋“  VM์„ ์ค‘์ง€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋‹ค
vagrant statusํ˜„์žฌ Vagrant ํ™˜๊ฒฝ์˜ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ฃผ๋‹ค
vagrant package์‹คํ–‰ ์ค‘์ธ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒ์ž๋กœ ํŒจํ‚ค์ง•ํ•˜๋‹ค
vagrant provision์‹คํ–‰ ์ค‘์ธ VM์— ๋Œ€ํ•ด ๊ตฌ์„ฑ๋œ ๋ชจ๋“  ํ”„๋กœ๋น„์ €๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
vagrant plugin installVagrant ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋‹คvagrant plugin install vagrant-vbguest
vagrant plugin list์„ค์น˜๋œ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‚˜์—ดํ•˜๋‹ค
vagrant plugin uninstall์„ค์น˜์™ผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ฑฐํ•˜๋‹คvagrant plugin uninstall vagrant-vbguest

Vagrant ์ƒ์ž ๋ช…๋ น

๋ช…๋ น์„ค๋ช…์˜ˆ์‹œ
vagrant box add์ƒ์ž๋Š” ๋‹ค์šด๋กœ๋“œํ•˜๋‹คvagrant box add centos/7
vagrant box list๋‹ค์šด๋กœ๋“œ๋œ ์ƒ์ž๊ฐ€ ๋ชจ๋“  ๋‚˜์—ดํ•˜๋‹ค
vagrant box outdated๋‹ค์šด๋กœ๋“œ์™ผ ์ƒ์ž๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
vagrant box update์ƒ์ž๊ฐ€ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋‹คvagrant box update centos/7
vagrant box repackage์ƒˆ ์ด๋ฆ„๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ƒ์ž๋ฅผ ๋‹ค์‹œ ํฌ์žฅํ•ฉ๋‹ˆ๋‹ค.vagrant box repackage centos/7 --name custom-centos
vagrant box prune์˜ค๋ž˜๋œ ์ƒ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋‹ค
vagrant box remove์ƒ์ž๊ฐ€ ์‚ญ์ œํ•˜๋‹คvagrant box remove centos/7

์ œ๊ณต์ž๋กœ์„œ์˜ VirtualBox

Vagrant์˜ ์ œ๊ณต์ž๋กœ VirtualBox๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ VM์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  VM์œผ๋กœ ๋‚˜์—ดํ•˜๋‹ค
vboxmanage list vms
  • ๋ชจ๋“  ์‹คํ–‰์ค‘VM๋“ค ๋‚˜์—ดํ•˜๋‹ค
vboxmanage list runningvms

์ฐธ๊ณ 

Pal, R. Vagrant Beginner Tutorial.https://www.youtube.com/playlist?list=PLhW3qG5bs-L9S272lwi9encQOL9nMOnRa
Hashicorp. Introduction to Vagrant. Retrieved 2024, November 14 from https://developer.hashicorp.com/vagrant/intro
Vagrant (software).ย Wikipedia. Retrieved 2024, November 14 from https://en.wikipedia.org/wiki/Vagrant_(software)
Hashicorp. Shell Provisioner. Retrieved 2024, November 14 from https://developer.hashicorp.com/vagrant/docs/provisioning/shell