IaC/Infrastructure Provisioning

Vagrant란?

Somaz 2022. 8. 25. 14:49
728x90
반응형

overview

오늘은 Vagrant에 대해서 공부해보려고 한다.

https://github.com/somaz94/vagant-packer

 

GitHub - somaz94/vagant-packer: This is Vagrant and Packer Collection

This is Vagrant and Packer Collection. Contribute to somaz94/vagant-packer development by creating an account on GitHub.

github.com


Vagrant란?

Vagrant는 단일 워크플로에서 가상 머신 환경을 구축하고 관리하기 위한 도구이다.

Provisioning 기능을 통하여 요구 사항에 맞는 가상 시스템 환경을 자동으로 구축가능하다.

가상 시스템 환경을 프로젝트로 분류하여 로컬에서 VM 생성, 삭제, 상태확인 등 VM 관리가 가능하다.

 


Vagrant up

 

KVM 설치

# yum -y group install 'Virtualization Host'

 

Enabling nested virtualization in KVM 설정 (VM 을 하이퍼바이저로 사용)

2022.09.02 - [Understand different OS Concepts/Virtualization] - Enable Nested Virtualization IN KVM In Linux

Nested 지원 설정 확인 (Y : enabled , N : disabled)

$ cat /sys/module/kvm_intel/parametes/nested
N

 

Nested 지원 설정

$ vi /etc/modprobe.d/kvm-nested.conf
options kvm-intel nested=1
options kvm-intel enable_shadow_vmcs=1
options kvm-intel enable_apicv=1
options kvm-intel ept=1

 

kvm_intel 커널 모듈 삭제 후 다시 로딩

$ modprobe -r kvm_intel
$ modprobe -a kvm_intel

 

PCI Passthrough enable & SR-IOV

vi /etc/default/grub
...
GRUB_CMDLINE_LINUX="nofb splash=quiet console=tty0 ... intel_iommu=on
...

# grub2-mkconfig -o /boot/grub2/grub.cfg

 

ipv4 Forwarding 설정

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

 

재부팅 후 하이퍼바이저 지원 상태 확인

# systemctl reboot

# virt-host-validate
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking if device /dev/kvm exists                                   : PASS
  QEMU: Checking if device /dev/kvm is accessible                            : PASS
  QEMU: Checking if device /dev/vhost-net exists                             : PASS
  QEMU: Checking if device /dev/net/tun exists                               : PASS
  QEMU: Checking for cgroup 'memory' controller support                      : PASS
  QEMU: Checking for cgroup 'memory' controller mount-point                  : PASS
  QEMU: Checking for cgroup 'cpu' controller support                         : PASS
  QEMU: Checking for cgroup 'cpu' controller mount-point                     : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
  QEMU: Checking for cgroup 'cpuacct' controller mount-point                 : PASS
  QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
...

 

Vagrant 설치

# sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
# sudo yum -y install vagrant
# sudo yum -y install qemu libvirt libvirt-devel ruby-devel gcc qemu-kvm libguestfs-tools
# vagrant plugin install vagrant libvirt
# vagrant plugin install vagrant-mutate

 

vagrant libvirt plugin 설치

# vagrant plugin install vagrant-libvirt
...
Installed the plugin 'vagrant-libvirt (0.7.0)'!

 

<옵션> Vagrant VM 생성용 kvm-libvirt Pool 생성, 서버의 /dev/sdb1 디스크를 사용

# mkfs.xfs /dev/sdb1

# mkdir -p /var/lib/libvirt/vagrant

# echo "$(blkid /dev/sdb1 -o export | grep ^UUID) /var/lib/libvirt/vagrant xfs default 0 0" >> /etc/fstab

# mount -a

# virsh pool-define-as --name vagrant --type dir --target /var/lib/libvirt/vagrant

# virsh pool-start vagrant

# virsh pool-autostart vagrant

 

https://www.vagrantup.com/downloads
https://www.vagrantup.com/docs/installation
https://www.vagrantup.com/docs/other/environmental-variables - Vagrant 환경변수
https://github.com/tlesne/ebook-2/blob/master/Vagrant/Pro%20Vagrant.pdf - Vagrant ebook


Vagrant Structure

해당 프로젝트의 최상위 디렉토리에서 'vagrant init' 명령어를 입력하였을때 Vagrantfile이 생성된다.

  • 초기 Vagrantfile 이 아직 존재하지 않는 경우 생성하여 현재 디렉토리를 Vagrant 환경으로 초기화합니다.
  • 첫 번째 인수가 주어지면 config.vm.box 생성된 Vagrantfile의 설정이 미리 채워집니다.
  • 두 번째 인수가 지정되면 config.vm.box_url 생성된 Vagrantfile의 설정이 미리 채워집니다.

즉 Vagrant는 최상의 디렉토리를 VM 생성 및 관리르 해야 할 프로젝트로 인식합니다.


Vagrantfile setting

먼저 설엉에 앞서 해당 파일을 실행할 때 사용되는 언어는 Ruby이다. 따라서 VM 정보의 블록을 do ~ end 로 묶어주고

|<name>| 으로 별칭을 설정할 수 있다.

 

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

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'libvirt'	
# vagrantfile가 사용할 기본 Provider 환경변수 설정

Vagrant.configure("2") do |config|	
# 해당 블록의 구성에 사용될 "2" 버전(현재 지원 버전: "1","2")

  Control = 3 # max number of control nodes
  Compute = 2 # max number of compute nodes
  Ceph = 1 # max number of ceph nodes
  Ver = '0.0.5' # Version

# 위의 파일들은 다수의 머신을 동시에 생성하기 위한, 변수설정입니다.

config.vm.synced_folder '.', '/vagrant', disabled: true
# synced_folder를 사용하면, 호스트 시스템의 폴더를 게스트 시스템과 동기화 할 수 있다.
# 위의 문법은 default로 공유폴더가 활성화 되어 있는 /vagrant 위치를 비활성화 하는 설정이다.

  #==============#
  # ControlNodes #
  #==============#

  (1..Control).each do |i|	# Vagrant 에 대한 정보를 loop over로 정의 (다중 vm 생성)
    config.vm.define "control0#{i}" do |cfg|	# 생성할 VM에 대한 정의
      cfg.vm.box = "somaz-testVM"	# Vagrant VM 생성에 사용할 BOX 정의
      cfg.vm.provider "libvirt" do |vb|	Vagrant의 provider를 정의
        vb.cpus = 16
        vb.memory = 98304
        vb.management_network_name = "service"
        vb.management_network_mac = "52:54:00:3f:2a:a#{i}"
        vb.storage_pool_name = "vagrant"
        vb.machine_virtual_size = 500
        vb.graphics_ip = "0.0.0.0"
      end
      cfg.vm.host_name = "control0#{i}"	# VM hostname을 지정
      cfg.vm.network "private_network", ip: "192.168.20.1#{i}",
        libvirt__network_name: "mgmt",
        libvirt__forward_mode: "none",
        libvirt__dhcp_enabled: "false"
      cfg.vm.network "forwarded_port", guest: 22, host: "6001#{i}", host_ip: "127.0.0.1"
      cfg.vm.provision "shell", path: "edu_init1.sh", args: [Control, Compute, Ceph]
    end

참고 자료

https://www.vagrantup.com/docs/cli/init

https://github.com/somaz94/vagant-packer

728x90
반응형