Vagrant를 통해 가상화 시스템을 구축하기 전에 IaC에 대한 대략적인 컨셉트를 알아보자.
하나의 애플리케이션을 구성하고 이를 배포하는데까지는 수 많은 시스템 간의 연계와 구성이 필요하다. 빠르게 변화하는 IT 산업이기에 이를 민첩하게 구축하는 것이 매우 중요하다. 하지만 상대적으로 개발에 비해 인프라는 한번 구성된 이상 시스템 변경이 어렵고 느리기 때문에 프로덕션 환경에서의 기존 인프라 환경의 유지는 효율성과 속도에 영향을 끼친다.
이를 개선하기 위한 것이 코드형 인프라이다.
코드형 인프라(Infastructure as Code, IaC)는 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝 하는 것을 의미한다. 코드를 통해 인프라시스템을 운영하기 때문에 반복적인 작업에 있어서 자동화가 가능하고 인적 실수를 줄일 수 있다. 또한 인프라 사양을 담은 구성 파일이 생성 되므로 구성을 편집하고 배포하기가 더 쉬워진다. 또한 IaC는 매번 동일한 환경을 프로비저닝하도록 보장한다. IaC로 인프라 프로비저닝을 자동화하면 애플리케이션을 개발하거나 배포할 때마다 개발자가 직접 서버, 운영 체제, 스토리지, 기타 인프라 구성 요소를 수동으로 프로비저닝하고 관리할 필요가 없어진다. 인프라를 코드화하여 템플릿을 만들고 프로비저닝할 때 이 템플릿을 사용하면 된다.
IaC는 DevOps 사례 및 CI/CD에서도 중요한 부분을 차지한다. 개발자가 하던 프로비저닝 작업을 대부분 IaC로 처리하고 개발자는 스크립트를 실행하여 인프라를 준비할 수 있다.
따라서 인프라 준비를 기다리는 동안 애플리케이션 배포를 보류할 필요가 없고, 시스템 관리자는 시간이 많이 소요되는 수동 프로세스를 관리하지 않아도 된다.
IaC를 구성했을 때의 장점을 정리해보면 다음과 같다.
Vagrant는 가상 시스템 환경을 구축, 관리하기 위한 도구이다. Virtualbox등의 VM(가상 머신)으로 가상 환경을 구축하기 위해서는 OS의 다운로드, HDD 파티션의 설정, SSH의 설치 등 많은 설정 과정이 필요하다. 그리고 설정이 자동화되지 않으므로, 다른 사람에게 설정 방법을 공유할 때는 순서를 기록으로 남겨둘 수밖에 없다. 만든 가상 머신의 이미지 파일을 공유하는 방법도 있지만, 사이즈도 커서, 쓰기나 읽기, 전송에 시간이 걸리는 문제도 존재한다.
하지만 Vagrant를 사용하면 커맨드 하나로 개발 환경이나 테스트 환경을 자동으로 구축할 수 있다. 코드로 작성해 둔 설정대로 세팅이 되기 때문에 설정 정보 공유가 가능하고 환경 구축을 자동화할 수 있다.
한마디로 Vagrant는 가상 시스템 환경을 관리하기 위한 도구로써 VM 환경 세팅 시간을 줄이고 개발 환경이나 테스트 환경을 자동으로 설정하도록 도와준다.
Vagrant가 지원하는 가상화 기술은 다음과 같다.
통상적으로는 VirtualBox + Vagrant를 많이 사용하고 레퍼런스도 가장 많다.
사용하기 쉬운 워크플로우와 자동화에 중점을 둔 Vagrant는 개발 환경 설정 시간을 단축하고, 프로덕션 간의 일관성을 높여주기 때문에 어느 환경에서나 동일하게 구축되므로 "내 컴퓨터에서는 잘 되는데"라는 변명을 쓸모없게 만든다.
Vagrantfile은 구축하고자 하는 머신의 종류부터 머신을 구성하는 설정 등을 기재할 수 있는 파일이다. 프로젝트당 하나의 Vagrantfile을 사용할 수 있고 파일 이름이 Vagrantfile
이어야 한다. vagrant up
명령어를 사용하면 자동적으로 Vagrantfile가 읽어들여져 기재되어 있는 설정대로 가상 환경을 구축할 수 있다. Vagrantfile은 Ruby로 작성되어 있지만 Ruby 지식이 전혀 없어도 충분히 작성할 수 있다.
Vagrantfile에는 가상 머신을 구축하기 위한 기본 설정들, 예를 들어 사용하고자 하는 OS나 접속 IP, 가상 머신 안에서 실행하고자 하는 쉘 파일 등을 기재할 수 있다. 또한 Vagrantfile은 단순히 파일이므로 공유하기도 간단하다.
Vagrantfile 예시
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Vagrant 설정 형식 버전 명시 (버전 2 사용)
Vagrant.configure("2") do |config|
# 사용할 가상 머신과 버전 지정
# box는 VM Image이고 vagrant cloud로부터 가져옴
config.vm.box = "ubuntu/bionic64"
config.vm.box_version = "20211207.0.0"
# 가상 머신의 호스트명 설정
config.vm.hostname = "my-ubuntu-machine"
# 가상 머신의 사설 IP 주소 설정
config.vm.network "private_network", ip: "192.168.33.10"
# 가상 머신의 리소스 설정
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 2
end
# 공유 폴더 설정
# 공유 폴더를 사용하지 않을 경우 "disabled : true" 명시
config.vm.synced_folder "프로젝트 경로", "/가상 머신 내 경로"
# 배포 중 실행하는 부분으로 VM을 생성하면서 해당 경로에 있는 Shell Scirpt를 자동으로 수행
config.vm.provision "shell", path: "스크립트.sh"
end
Vagrant의 설치 방법 굉장히 간단하다. 하지만 Vagrant을 사용하기 위해서는 VirtualBox와 같이 Vagrant가 지원하는 가상 머신이 설치되어 있어야 한다.
Vagrant 공식 사이트에서 본인이 사용하는 OS 맞는 설치법을 따라하면 된다. MacOS의 경우 homebrew가 설치되어 있다면 다음과 같이 brew를 통해 설치할 수 있다.
brew tap hashicorp/tap
brew install hashicorp/tap/hashicorp-vagrant
vagrant init
프로비저닝은 시스템에 소프트웨어를 자동으로 설치하고 구성을 변경하는 등 준비 작업을 의미한다.
vagrant up
작성된 Vagrantfile을 바탕으로 프로비저닝(VM 생성 및 실행)을 진행한다.
vagrant box list
현재 시스템에 설치된 Box(VM Image) 목록을 보여준다.
vagrant status
현재 실행중인 VM의 상태를 보여준다.
vagrant halt
실행중인 가상 머신을 종료한다.
vagrant destroy
생성된 가상 머신을 삭제한다. -f
옵션을 사용하면 halt까지 동시에 수행한다.
vagrant ssh
Vagrant에서 생성된 가상 머신에 ssh로 접속한다.
vagrant provision
가상 머신의 설정을 변경하고 적용한다.
vagrant ssh
실행중인 VM에 ssh로 접속한다.
vagrant reload
: 실행된 VM을 재실행한다. (Vagrantfile에 수정된 내용이 있다면 해당 내용을 반영)
Reference