✔️ Vagrant란 ?
- 단일 워크 플로우로 가상 시스템 환경을 구축하고 관리하기위한 도구
- Provision 기능을 통하여 요구 사항에 맞는 가상 시스템 환경을 자동으로 구축 가능
- 가상 시스템 환경을 프로젝트로 분류하여 로컬에서 VM 생성, 삭제, 상태확인 등 VM 관리 가능
✔️ Vagrant를 사용하는 이유
VirtualBox의 VM을 일반적인 방법으로 생성하였을때 필요한 사항
- VirtualBox로 VM을 생성하기 위해서 요구사항에 맞는 OS의 ISO 파일이 있어야 한다.
- VM의 리소스 자원을 설정(CPU, Memory, Disk etc....)
- VM의 IP를 설정하고 필요한 서비스 및 보안사항들을 체크하여 가상머신을 구성한다.
- VM을 생성한 뒤 서비스 관리에 필요한 User 생성과 권한 부여 그리고 필요한 서비스 설치
같은 구성의 가상 컴퓨터를 구축할 때 동일한 작업을 좀 더 편리하고 쉽게 관리할수 있는 방법을 고안한 소프트웨어인 Vagrant는 Vagrantfile에 작성된 작업내용을 실행하여 가상 시스템 환경을 구축한다.
Vagrant는 Vagrantfile에 작성된 내용으로 VM을 생성하기 시작한다.
VM을 생성하면서 필요한 ISO 파일을 vagrantcloud에서 가져와 VirtualBox에 추가하게 된다.
그리고 VirtualBox에서는 Vagrant가 전송한 정보를 기반으로 VM을 생성하게 된다.
Vagrant의 장점
- Vagrantfile에 작성된 내용으로 가상 시스템이 자동으로 구축된다.
- 프로젝트에 있는 VM을 관리할 수 있다. (vagrant 명령어로 상태 확인, 중지, 삭제, 생성 등이 가능)
- provision 설정을 통해 요구사항에 맞는 서비스를 설정 및 실행할수 있다.
Vagrant의 단점
- provision 설정에서 오류가 발생한다면 vagrant가 멈추면서 동작을 하지 않는다.
→ 자세히 말하자면 멀티 VM을 구축할때 1번 VM의 provision이 오류가 발생하면 다음 VM이 생성되지 않는다.
✔️ Vagrant 명령어
✔️ Vagrant 명령어 확인
vagrant
✔️ Vagrantfile 생성
vagrant init <IMAGE>
✔️ VM 버전 확인
vagrant -v
✔️ 호스트 머신 전체의 Vagrant 가상 이미지들의 상태 확인
vagrant global-status
✔️ VM 생성 및 부팅
vagrant up [VM_NAME]
✔️ VM 재부팅
vagrant reload [VM_NAME]
✔️ VM 강제 종료
vagrant halt [VM_NAME]
✔️ VM 종료 및 이미지 삭제
vagrant destroy [VM_NAME]
✔️ VM 하이버네이트, 상태 보존
vagrant suspend [VM_NAME]
✔️ 변경된 VgrantFile 적용
vagrant reload
✔️ VM SSH 접속
vagrant ssh [VM_NAME]
✔️ Vagrant 사용 예시
choco 사용 예시
앞서 설치한 Vagrant를 사용해 virtualbox를 설치해보자(실습 환경은 Windows이다.)
우선 choco 명령어를 사용해 virtualbox 패키지를 검색해보자
choco search virtualbox
일반적으로 우리가 만든 가상 컴퓨터의 이름으로 아래의 경로에 저장이 된다.
C:\Users\사용자명\VirtualBox VMs
Vagrant를 이용해 가상 컴퓨터를 생성해볼 것이다.
현재 virtualbox에는 centos7이라는 가상 머신만 존재한다.
PS C:\Users\Shinsohui> mkdir vagrant
PS C:\Users\Shinsohui> cd .\vagrant\
PS C:\Users\Shinsohui\vagrant> mkdir test
PS C:\Users\Shinsohui\vagrant> ls
ova 파일을 이용해 centos7을 설치했던 것처럼 vagrant로 가상 머신을 설치할 때도 이미지가 필요하다.
Vagrant Cloud에 접속해서 검증된 이미지나 다른 사람들이 올린 이미지 파일을 사용할 수 있다.
Vagrant init 명령을 사용해 centos/7 이미지를 가져와 해당 경로에 설치한다.
PS C:\Users\Shinsohui\vagrant> vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
Vagrant는 파일명이 대문자로 시작해야 한다.
PS C:\Users\Shinsohui\vagrant\test> ls
디렉터리: C:\Users\Shinsohui\vagrant\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022-04-11 오후 5:54 3084 Vagrantfile
notepad를 이용해 Vagrant 파일을 열어보자
PS C:\Users\Shinsohui\vagrant\test> notepad .\Vagrantfile
주석을 모두 제거하면 다음과 같은 내용만이 남는다.
Vagrant up 명령 실행 시 Vagrant 파일이 반드시 현재 경로에 있어야 한다.
해당 경로에 Vagrant 파일이 없다면 다음과 같은 메세지가 출력된다.
PS C:\Users\Shinsohui\vagrant> vagrant up
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment. Or,
get an ID of a target machine from `vagrant global-status` to run
this command on. A final option is to change to a directory with a
Vagrantfile and to try again.
파일이 위치한 경로로 이동해 vagrant up 명령을 입력하면 설치가 시작된다.
어떠한 옵션도 주지 않았으므로 default 설치로 진행되며
처음 설치를 진행하면 해당 이미지가 위치한 경로에서 파일을 다운로드 한다.
설치 완료 메세지가 뜬 후 virtualbox를 열면 default로 생성한 파일이 생성되고 실행 중인 것을 확인할 수 있다.
다시 terminal로 돌아가 가상 머신의 상태를 확인해보자
PS C:\Users\Shinsohui\vagrant\test> vagrant status
Current machine states:
default running (virtualbox) # 현재 작동 중인 가상 머신 툴 이름
The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
이 때 vagrant halt를 통해 가상 머신을 끌 수 있다.
PS C:\Users\Shinsohui\vagrant\test> vagrant halt
==> default: Attempting graceful shutdown of VM...
PS C:\Users\Shinsohui\vagrant\test> vagrant status
Current machine states:
default poweroff (virtualbox)
The VM is powered off. To restart the VM, simply run `vagrant up`
여기서 다시 vagrant up을 해보면 이미 Vagrantfile에 정의된 가상 컴퓨터가 있어 이미지 설치 과정없이 부팅하게 된다.
PS C:\Users\Shinsohui\vagrant\test> vagrant status
Current machine states:
default poweroff (virtualbox)
The VM is powered off. To restart the VM, simply run `vagrant up`
PS C:\Users\Shinsohui\vagrant\test> vagrant up
==> default: Checking if box 'centos/7' version '2004.01' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default: Warning: Connection reset. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: No guest additions were detected on the base box for this VM! Guest
default: additions are required for forwarded ports, shared folders, host only
default: networking, and more. If SSH fails on this machine, please install
default: the guest additions and repackage the box to continue.
default:
default: This is not an error message; everything may continue to work properly,
default: in which case you may ignore this message.
==> default: Rsyncing folder: /cygdrive/c/Users/Shinsohui/vagrant/test/ => /vagrant
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
PS C:\Users\Shinsohui\vagrant\test> vagrant status
Current machine states:
default running (virtualbox)
The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
가상 컴퓨터의 내부로 들어가려면 vagrant ssh를 이용한다.
VM은 기본적으로 GUI가 설정되어 있지 않고 계정에 패스워드 자체가 없다. 따라서 패스워드 방식으로 접근이 불가하다.
따라서 ssh를 이용하면 키 기반 인증으로 가상 컴퓨터 내부에 접속할 수 있다.
PS C:\Users\Shinsohui\vagrant\test> vagrant ssh
[vagrant@localhost ~]$
[vagrant@localhost ~]$ exit
logout
Connection to 127.0.0.1 closed.
PS C:\Users\Shinsohui\vagrant\test>
vagrant destory를 이용해 가상 컴퓨터를 지울 수 있다.
PS C:\Users\Shinsohui\vagrant\test> vagrant destroy
default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...
가상 컴퓨터가 정상적으로 삭제되었다.
✔️ Vagrantfile 예제 코드
Vagrant.configure("2") do |config| # "2"는 vagrant의 버전을 나타낸다.
# Define VM
config.vm.define "myvm1" do |centos| # vagrant로 관리할 이름을 지정한다.
centos.vm.box = "centos/7" # myvm1에 대한 설정
centos.vm.hostname = "myvm1" # hostname을 자동으로 설정한다.
centos.vm.network "private_network", ip: "192.168.56.11" # private network의 ip 지정
centos.vm.provider "virtualbox" do |vb| # vagrant 입장에서 provider는 virtualbox이다.
vb.name = "myvm1" # 가상 컴퓨터의 이름 (virtualbox에서 나오는 이름)
vb.cpus = 2
vb.memory = 2048
end
config.vm.provision "shell", inline: <<-SHELL # user data 영역으로 cloud-unit이 수행
#!/bin/bash
echo "hello world" > /tmp/hello.txt
SHELL
end
# Define VM
config.vm.define "myvm2" do |centos|
centos.vm.box = "centos/7"
centos.vm.hostname = "myvm2"
centos.vm.network "private_network", ip: "192.168.56.12"
centos.vm.provider "virtualbox" do |vb|
vb.name = "myvm2"
vb.cpus = 2
vb.memory = 2048
end
config.vm.provision "shell", inline: <<-SHELL
#!/bin/bash
echo "hello world" > /tmp/hello.txt
SHELL
end
end
위의 vagrant 파일을 이용해 가상 컴퓨터를 생성해보자
PS C:\Users\Shinsohui\vagrant> mkdir myvm1
디렉터리: C:\Users\Shinsohui\vagrant
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022-04-11 오후 6:20 myvm1
PS C:\Users\Shinsohui\vagrant> cd myvm1
PS C:\Users\Shinsohui\vagrant\myvm1> notepad Vagrantfile
여기서 vagrant up을 했을 때 환경 설정 메세지가 나오는 이유는 notepad로 Vagrantfile을 작성한 뒤 저장하면
뒤에 확장자명인 .txt가 붙기 때문에 vagrant 명령이 인식을 못하기 때문이다.
PS C:\Users\Shinsohui\vagrant\myvm1> vagrant up
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment. Or,
get an ID of a target machine from `vagrant global-status` to run
this command on. A final option is to change to a directory with a
Vagrantfile and to try again.
PS C:\Users\Shinsohui\vagrant\myvm1> ls
디렉터리: C:\Users\Shinsohui\vagrant
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022-04-11 오후 5:54 .vagrant
d----- 2022-04-11 오후 6:20 myvm1
d----- 2022-04-11 오후 6:01 test
-a---- 2022-04-11 오후 6:21 893 Vagrantfile.txt
Vagrantfile.txt의 내용을 Vagrant 파일로 복사하면 실행이 된다.
PS C:\Users\Shinsohui\vagrant\myvm1> mv .\Vagrantfile.txt .\Vagrantfile
PS C:\Users\Shinsohui\vagrant\myvm1> vagrant up
구성 확인
PS C:\Users\Shinsohui\vagrant\myvm1> vagrant ssh
[vagrant@myvm1 ~]$ hostname
myvm1
[vagrant@myvm1 ~]$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[vagrant@myvm1 ~]$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: AuthenticAMD
CPU family: 23
Model: 8
Model name: AMD Ryzen 7 2700X Eight-Core Processor
Stepping: 2
CPU MHz: 3700.104
BogoMIPS: 7400.20
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 64K
L2 cache: 512K
L3 cache: 16384K
NUMA node0 CPU(s): 0,1
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx fxsr_opt rdtscp lm constant_tsc art rep_good nopl nonstop_tsc extd_apicid pni ssse3 cx16 sse4_1 sse4_2 hypervisor lahf_lm cmp_legacy cr8_legacy retpoline_amd ssbd vmmcall fsgsbase arat
[vagrant@myvm1 ~]$ head /proc/meminfo
MemTotal: 1881940 kB
MemFree: 1663436 kB
MemAvailable: 1643048 kB
Buffers: 2068 kB
Cached: 100004 kB
SwapCached: 0 kB
Active: 75016 kB
Inactive: 71944 kB
Active(anon): 45072 kB
Inactive(anon): 8472 kB
[vagrant@myvm1 ~]$ cat /tmp/hello.txt
hello world
[vagrant@myvm1 ~]$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 86227sec preferred_lft 86227sec
inet6 fe80::5054:ff:fe4d:77d3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:83:0c:84 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.11/24 brd 192.168.56.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe83:c84/64 scope link
valid_lft forever preferred_lft forever
🔗참고
'Useful' 카테고리의 다른 글
oh-my-zsh 로 터미널 환경 구성하기 (0) | 2022.05.06 |
---|---|
[Packer] Packer 설치 및 사용법 (0) | 2022.05.03 |
Chocolatey 개념 및 설치 방법 (0) | 2022.05.03 |
Ansible playbook 작성을 위한 VScode Extensions 세팅 (0) | 2022.04.15 |
WinSCP를 이용해 Windows에서 Linux 가상 머신으로 파일 전송하기 (0) | 2022.04.13 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!