overview
오늘은 Vagrant에 대해서 공부해보려고 한다.
https://github.com/somaz94/vagant-packer
Vagrant란?
Vagrant는 단일 워크플로에서 가상 머신 환경을 구축하고 관리하기 위한 도구이다.
Provisioning 기능을 통하여 요구 사항에 맞는 가상 시스템 환경을 자동으로 구축가능하다.
가상 시스템 환경을 프로젝트로 분류하여 로컬에서 VM 생성, 삭제, 상태확인 등 VM 관리가 가능하다.
Vagrant up
KVM 설치
# yum -y group install 'Virtualization Host'
Enabling nested virtualization in KVM 설정 (VM 을 하이퍼바이저로 사용)
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
참고 자료
'IaC > Infrastructure Provisioning' 카테고리의 다른 글
4. Terraform의 다양한 Function(함수) (0) | 2023.04.11 |
---|---|
3. Terraform 다양한 변수(variable, local, data...output, input) - AWS (0) | 2023.04.09 |
2. Terraform 변수 사용법(use-variable) - AWS (0) | 2023.04.05 |
1. Terraform 기초 : 설치 및 .tf 파일 설명 (0) | 2023.04.04 |
Packer란? (0) | 2022.09.05 |