Vagrant란?

음휘영·2023년 5월 11일
0

docker/kubernetes

목록 보기
1/3

IaC란?

IAC(Infrastructure as Code)는 인프라를 코드로서 정의하고 관리하는 개념을 의미합니다.

IAC를 사용하면 인프라를 코드로 작성하여 버전 관리 시스템과 같은 도구를 사용하여 변경 내역을 추적하고 관리할 수 있다. 이를 통해 기존의 수동적이고 반복적인 인프라스트럭처 관리 작업을 자동화하고 효율성을 높일 수 있다.

IAC의 장점:

  • 일관성: 코드로 인프라를 정의하면 반복 가능하고 일관된 방식으로 인프라를 배포할 수 있다. 수동 작업에 의존하는 것보다 실수를 줄이고 일관성을 유지할 수 있다.
  • 자동화: 인프라 아키텍처 배포를 코드화하고 자동화하여 개발 수명주기 전체에 걸쳐 효율성과 생산성을 크게 향상할 수 있다.
  • 확장성: 코드 기반의 인프라는 확장성이 용이하다. 필요에 따라 인프라 자원을 증가시키거나 축소시킬 수 있으며, 코드를 수정하여 인프라의 구성을 변경할 수 있다.

IAC를 구현하기 위한 도구로는 Ansible, Terraform, AWS CloudFormation 등이 있다.

IAC는 클라우드 환경에서 특히 유용하며, 인프라스트럭처의 유연성, 일관성, 확장성, 자동화 등을 통해 애플리케이션 개발과 배포의 효율성을 크게 향상시킨다.


Vagrant 란?

Vagrant 란 Virtualbox등 가상화 소프트웨어를 "CUI(캐릭터 유저 인터페이스)"로 조작하기 위한 소프트웨어이다. 즉, 가상환경 소프트웨어가 설치되어 있지 않다면, Vagrant는 사용할 수 없다.

vagrant는 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포 해두었다가 필요할 때 시스템을 사용할 수 있는 상태로 만들어준다. 이를 프로비저닝(provisioning)이라고 한다.

Vagrant는 가상화 기술을 기반으로 동작하며, 주로 가상화 플랫폼인 VirtualBox, VMware, Docker와 함께 사용된다. 개발 환경을 정의하는 Vagrantfile이라는 파일을 작성하여 Vagrant를 설정하고 실행하는데, Vagrantfile은 개발자가 원하는 가상 머신의 속성과 구성을 지정하는 역할을 한다.

Vagrant를 사용하면 팀 간에 동일한 개발 환경을 공유하고 구성할 수 있어, 이는 개발 환경 간의 일관성을 유지하고 개발자들이 동일한 조건에서 작업할 수 있도록 도와준다. 또한 가상 머신의 프로비저닝, 네트워크 설정, 파일 공유 등을 자동화하여 개발자의 작업 생산성을 향상시킨다.

Vagrant는 CLI(Command Line Interface)를 통해 사용되며, 개발자는 명령어를 통해 가상 머신을 생성, 시작, 중지, 삭제하는 등의 작업을 수행할 수 있다. Vagrant는 개발 언어나 프레임워크에 종속되지 않으며, 다양한 개발 스택과 함께 사용할 수 있다.

VirtualBox와 비교해 Vagrant는 아래와 같은 특징이 있다.

  • 커맨드 하나로 가상 구축이 완료된다.
  • 가상 머신의 설정이 간단하다.
  • 설정 정보의 공유가 가능하다.
  • 환경 구축을 자동화할 수 있다

VirtualBox 단위로 가상 환경을 만드는 경우, OS의 다운로드, HDD 파티션의 설정, SSH의 설치 등 많은 설정과정이 필요하다.
또한 만들어놓은 설정을 다른 사람에게 공유하는 경우 문서화 하는 과정이 필요하고, 만드는 과정이 자동화되지 않아 수동 복제 시 사이즈도 커서, 쓰기나 읽기, 전송에 시간이 걸리는 문제도 존재한다.


vagrant를 간단하게 구성하기

  1. vagrant의 설치 파일은 공식 홈페이지에서 다운로드 받을 수 있다.
    https://developer.hashicorp.com/vagrant/docs/installation

  2. 설치 이후 cmd에서 베이그런트 설치 디렉터리로 이동 후
    vagrant init명령을 실행해 프로비저닝에 필요한 기본 코드를 생성한다.

  3. vagrant의 이미지는 vagrant cloud에서 받을 수 있다.
    https://app.vagrantup.com/boxes/search
    vagrant cloud 에서 검색 후 원하는 환경 선택하여 우선 box를 먼저 다운로드 한다.
    vagrant box add generic/rocky8
    이후 vagrantfile 의 vm.box에 해당 박스 이름을 삽입한다.

자주 사용하는 vagrant 명령어는 다음과 같다.

베이그런트 명령어설명
vagrant init프로비저닝을 위한 기초 파일을 생성한다.
vagrant upvagrantfile을 읽어들여 프로비저닝을 진행한다.
vagrant box listvagrant에 등록된 box 리스트를 조회 할 수 있다.
vagrant haltvagrant에서 다루는 가상머신을 종료한다.
vagrant destroy -fvagrant에서 다루는 가상머신을 삭제한다.
vagrant sshvagrant에서 다루는 가상머신에 ssh로 접속한다.
vagrant provisionvagrant에서 관리하는 가상머신에 변경된 설정을 적용한다.

다음의 예시에서는 가상머신 설치와 동시에 shell file을 참조하여 필요한 패키지를 설치하고, ping을 보내는 가상머신을 추가로 만든다.

host 전용 네트워크는 호스트 내부에 192.168.1.0 대의 사설망을 구성한다.
가상머신은 NAT(Network Address Translation: 네트워크 주소 변환) 인터페이스인 eth0을 통해서 인터넷에 접속한다.

Vagrantfile

# -*- mode: ruby -*-  
# vi: set ft=ruby :   //ruby코드 인식

Vagrant.configure("2") do |config|   //2: api version, config 설정의 시작
  config.vm.define "m-k8s" do |cfg|  //"m-k8s"라는 가상머신 설정
    cfg.vm.box = "bento/rockylinux-8"     //사용하는 box를 설정
    cfg.vm.provider "virtualbox" do |vb|  //virtualbox에서 사용한다고 명시
      vb.name = "m-k8s"  //버추얼 박스에 생성한 가상머신의 이름
      vb.cpus = 2
      vb.memory = 2048
      vb.customize ["modifyvm", :id, "--groups", "/k8s-SM"]  //소속 그룹 명시
    end    //버추얼 박스 설정이 끝남
    cfg.vm.host_name = "m-k8s"  //가상 머신 자체에 대한 설정
    cfg.vm.network "private_network", ip: "192.168.1.10"  //eth1 인터페이스를 host-only로 구성하고 ip 설정
    cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"   
	//host의 60010번을 guest의 22번과 연결, auto_correc: true -> 포트 중복시 포트가 자동으로 변경
    cfg.vm.synced_folder "../data", "/vagrant", disabled: true   
    cfg.vm.provision "shell", path: "install_pkg.sh"  //같은 디렉터리에 있는 shell file을 참조하여 필요한 패키지를 설치한다.
    cfg.vm.provision "file", source: "ping_2_nds.sh", destination: "ping_2_nds.sh" 
    cfg.vm.provision "shell", path: "config.sh"
  end
  
  #=============#
  # Added Nodes #
  #=============#

  (1..3).each do |i|    //i를 변수로 사용하여 각각 다른 이름의 가상머신을 생성할 수 있다. 
    config.vm.define "w#{i}-k8s" do |cfg|
      cfg.vm.box = "bento/rockylinux-8"
      cfg.vm.provider "virtualbox" do |vb|
        vb.name = "w#{i}-k8s"
        vb.cpus = 1
        vb.memory = 1024
        vb.customize ["modifyvm", :id, "--groups", "/k8s-SM"]
      end
      cfg.vm.host_name = "w#{i}-k8s"
      cfg.vm.network "private_network", ip: "192.168.1.10#{i}"
      cfg.vm.network "forwarded_port", guest: 22, host: "6010#{i}",auto_correct: true, id: "ssh"
      cfg.vm.synced_folder "../data", "/vagrant", disabled: true  //host와 guest 사이에 디렉터리 동기화가 이뤄지지 않게 설정
      cfg.vm.provision "shell", path: "install_pkg.sh"  
    end
  end
end  //do 와 end의 들여쓰기 위치가 정확하게 일치해야한다.

install_pkg.sh

#!/usr/bin/env bash
# install packages 
yum install epel-release -y
yum install vim-enhanced -y

ping_2_nds.sh

# ping 3 times per nodes
ping 192.168.1.101 -c 3
ping 192.168.1.102 -c 3
ping 192.168.1.103 -c 3

config.sh

#!/usr/bin/env bash
# modify permission  
chmod 744 ./ping_2_nds.sh

vagrantfile을 작성한 후 vagrant up을 실행하고 해당 가상머신 이미지를 내려받는지 확인할 수 있다.
설치가 끝나면 버추얼 박스를 실행해 가상 머신이 제대로 생성되었는지 확인한다.
cmd로 돌아와 vagrant ssh 명령어를 실행해 설치된 rockylinux8 에 접속한다.


참고자료
https://kitsune.blog/linux-environment#Vagrant%E3%81%A8%E3%81%AF

profile
꾸준하게

0개의 댓글