Vagrant 시작하기

smpl published on
2 min, 237 words

Tags: vagrant

Vagrant는 Hashicorp에서 개발한 일관되고, 재현 가능하고, 복제 및 공유가 가능한 커맨드라인 기반의 가상환경 관리 도구이다. 주로 단일 개발 환경에서의 가상환경 관리에 사용되며, 보다 더 대규모의 인프라 관리를 위해서는 Puppet이나 Chef, Ansible 등과 함께 사용하거나, 역시 Hashicorp에서 만든 Terraform을 사용하는 것으로 보인다.

간단하게 로컬 환경에서 학습용으로 간이 K8S 클러스터를 구성해본다거나 하는데 사용될 수 있을 것으로 보여 알아본다.

기본적인 사용법

설치

윈도우 환경에서는 다음과 같이 입력하여 Vagrant를 설치할 수 있다.

winget insall Hashicorp.Vagrant

Vagrantfile 생성

Vagrant는 Vagrantfile이라는 설정을 기반으로 관리된다.

처음 Vagrantfile을 만들려면 다음과 같이 입력한다. 필요한 Vagrant Box가 없을 경우 자동으로 가져온다. 사용 가능한 Vagrant Box는 Hashicorp Vagrant Public Registry에서 찾을 수 있다.

vagrant init ubuntu/focal64 --box-version 20240821.0.1

vagrant box list # vagrant box 목록 조회

가상머신 실행

vagrant up
vagrant up --provider=virtualbox # virtualbox를 provider로 명시적으로 선택

vagrant status # 상태 확인 (실행 완료 전에도 Running으로 보임)

가상머신 ssh 접속

vagrant ssh
vagrant ssh-config # 키 정보 조회

가상머신 일시 중지/재개

vagrant suspend
vagrant resume

가상머신 중지

가상머신을 종료한다. docker와는 달리, 실행 중 작업 내용이 초기화되지 않으나, 다른 머신에 그대로 환경을 복제하기 위해서는 Vagrantfile에 프로비저닝 정보로 작성하거나, 별도로 폴더를 싱크하여 작업내용을 저장시켜야 한다.

vagrant halt

가상머신 삭제 / Vagrant Box 삭제

vagrant destroy
vagrant box remove ubuntu/focal

기본적인 예시

3개의 우분투 가상머신 생성하기

3개의 우분투 가상머신을 셋팅하고, 프로비저닝 명령어를 통해 HTTP 서버를 띄우고 종료시킬 수 있음을 확인해본다.

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  (1..3).each do |i|
    config.vm.define "ubuntu#{i}" do |cfg|
      cfg.vm.box = "ubuntu/focal64"
      cfg.vm.box_version = "20240821.0.1"

      cfg.vm.provider "virtualbox" do |vb|
        vb.name = "ubuntu#{i}"
        vb.cpus = 2
        vb.memory = "1024"
      end

      cfg.vm.network "private_network", ip: "192.168.33.#{10 + i}"
      cfg.vm.network "forwarded_port", guest: 8000, host: 8080 + i, host_ip: "127.0.0.1"

      cfg.vm.synced_folder "./data", "/vagrant_data"
      cfg.vm.synced_folder ".", "/vagrant", disabled: true

      cfg.vm.provision "shell", name:"init", path:"init.sh"
      
      cfg.vm.provision "shell", name:"start_server", run:"never", inline: <<-SHELL
        echo "Starting simple HTTP server..."
        python3 -m http.server 8000 &
        echo "Server started on port 8000"
      SHELL

      cfg.vm.provision "shell", name:"stop_server", run:"never", inline: <<-SHELL
        echo "Stopping simple HTTP server..."
        pkill -f "python3 -m http.server"
        echo "Server stopped."
      SHELL

    end
  end
end

init.sh

#!/bin/bash

echo "Hello, Vagrant! $HOSTNAME" > ./index.html

apt-get update
apt-get install -y python3 python3-pip

echo "Setup complete."

프로비저닝 명령 내리기

vagrant provision --provision-with start_server
vagrant provision --provision-with stop_server

References