Vagrant란?
개발자들은 프로젝트를 진행하면서 다양한 개발 환경을 접합니다. 프로젝트별 복잡하게 얽혀있는 시스템 구성요소들(운영체제, 라이브러리, 데이터베이스등)은 개발자와 시스템 관리자를 더욱 힘들게 할뿐이죠.
개발자는 손쉽게 개발환경에 접근할 수 있어야 합니다. 가상머신을 사용하여 이를 해결할 수 있습니다. 하지만 사용하려는 운영체제의 이미지를 찾고, 가상머신의 스펙을 수정하고, 관련된 라이브러리들을 설치하는 일들은 꽤나 성가신 일입니다.
Vagrant는 이런 단점을 보완합니다. Infrastructure as Code(IaC)의 개념을 사용하여 Ruby spec의 간단한 코드 몇줄로 가상머신 스펙을 설정하고, OS 이미지를 다운받고 설치함은 물론, OS에 설치할 라이브러리와 명령 커맨드까지 실행할 수 있습니다.
이번 블로그에서 Vagrant설치와 함께 Ubuntu 환경에 Nginx를 설치하는 예제를 다뤄봅니다.
설치환경
- OS: Winsodws 10
- VM도구: Oracle VIrtualbox 7.0 ( Windows 가상화 환경 WSL이 설치되어 있어야 함 )
Windows용 패키지관리 도구 설치
Vagrant 설치를 위해 Windows용 패키지관리 도구 Chocolatey를 설치합니다.
2023.04.17 - [OS] - Chocolatey, 윈도우 패키지 매니저! 이제 윈도우에서도 apt, brew 처럼 쉽게 패키지를 관리하자
Chocolatey 설치 후 정상 동작 확인
choco 명령은 powershell을 관리자 모드로 실행합니다.
PS C:\Users\user1> choco
Chocolatey v1.3.1
Vagrant 패키지 검색
PS C:\Users\user1> choco find vagrant
Chocolatey v1.3.1
vagrant 2.3.7 [Approved] Downloads cached for licensed users
vagrant-manager 1.0.0.6 [Approved] Downloads cached for licensed users
vagrant-vmware-utility 1.0.22 [Approved] Downloads cached for licensed users
vagrant-winrm-config 0.0.1 [Approved]
packer-post-processor-vagrant-vmware-ovf 0.2.1.20150603 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
vagrant_plugins 1.0.0.1 - Possibly broken
win2003-mklink 1.6.0.20140724 [Approved]
packer 1.9.1 [Approved]
gbt 2.0.0.1 [Approved] Downloads cached for licensed users
chef_development 1.0.0.4 - Possibly broken
picassio 0.12.0 [Approved] Downloads cached for licensed users
phpstorm 2023.1.3 [Approved] Downloads cached for licensed users
12 packages found.
Vagrant 설치
PS C:\Users\user1> choco install vagrant --version 2.3.7
Chocolatey v1.3.1
Installing the following packages:
vagrant
By installing, you accept licenses for the packages.
Progress: Downloading vagrant 2.3.7... 100%
vagrant v2.3.7 [Approved]
vagrant package files install completed. Performing other installation steps.
The package vagrant wants to run 'chocolateyinstall.ps1'.
Note: If you don't run this script, the installation will fail.
Note: To confirm automatically next time, use '-y' or consider:
choco feature enable -n allowGlobalConfirmation
Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint): A
... 중략 ...
Download of vagrant_2.3.7_windows_amd64.msi (260.33 MB) completed.
Hashes match.
Installing vagrant...
vagrant has been installed.
Vagrant 확인
PS C:\Users\user1> vagrant
Usage: vagrant [options] <command> [<args>]
-h, --help Print this help.
Common commands:
autocomplete manages autocomplete installation on host
box manages boxes: installation, removal, etc.
cloud manages everything related to Vagrant Cloud
destroy stops and deletes all traces of the vagrant machine
global-status outputs status Vagrant environments for this user
halt stops the vagrant machine
help shows the help for a subcommand
init initializes a new Vagrant environment by creating a Vagrantfile
login
package packages a running vagrant environment into a box
plugin manages plugins: install, uninstall, update, etc.
port displays information about guest port mappings
powershell connects to machine via powershell remoting
provision provisions the vagrant machine
push deploys code in this environment to a configured destination
rdp connects to machine via RDP
reload restarts vagrant machine, loads new Vagrantfile configuration
resume resume a suspended vagrant machine
serve start Vagrant server
snapshot manages snapshots: saving, restoring, etc.
ssh connects to machine via SSH
ssh-config outputs OpenSSH valid configuration to connect to the machine
status outputs status of the vagrant machine
suspend suspends the machine
up starts and provisions the vagrant environment
upload upload to machine via communicator
validate validates the Vagrantfile
version prints current and latest Vagrant version
winrm executes commands on a machine via WinRM
winrm-config outputs WinRM configuration to connect to the machine
For help on any individual command run `vagrant COMMAND -h`
Additional subcommands are available, but are either more advanced
or not commonly used. To see all subcommands, run the command
`vagrant list-commands`.
--[no-]color Enable or disable color output
--machine-readable Enable machine readable output
-v, --version Display Vagrant version
--debug Enable debug output
--timestamp Enable timestamps on log output
--debug-timestamp Enable debug output with timestamps
--no-tty Enable non-interactive output
Vagrant로 개발환경 구성
이제 정상적으로 vagrant를 설치했으니 필요한 OS가 vagrant 패키지매니저에서 제공하는지 확인해봅니다.
(Vagrant는 dockerhub와 같이 클라우드 이미지 저장소, Vagrant Cloud를 제공합니다.)
https://app.vagrantup.com/boxes/search
접속하여 Ubuntu 20.04를 검색합니다.
official 로 등록된 이미지를 확인합니다. (일반 개인이 이미지를 올릴수 있으므로 되도록 official 이미지만을 사용하길 바랍니다.)
링크를 타고 들어가면 아래와 같은 Vagrant Code를 볼수 있습니다.
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
end
- 단 3줄의 코드로 ubuntu vm 환경을 만들 수 있습니다.
Vagrant init
Vagrant 코드를 실행할 디렉토리에서 아래의 명령을 수행합니다.
PS D:\nginx> vagrant init
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.
- init을 실행하면 해당 디렉토리에
Vagrantfile
이 생성됩니다.
Vagrantfile
provision
지시자를 사용하여 가상환경 구성시 sh프로그램을 실행
- config.sh - os 설정 shell
- install_pkg.sh - 패키지 설치 관련 shell
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
config.vm.host_name = "nginx-server"
config.vm.provision "shell", path: "config.sh"
config.vm.provision "shell", path: "install_pkg.sh"
end
config.sh
#!/usr/bin/env bash
# swapoff -a to disable swapping
# swap은 메모리가 부족할 때 하드 디스크를 사용하여 메모리를 확보하는 기능, 성능, 보안에 취약할 수 있다.
swapoff -a
# swap 파티션 사용 하지 않음
sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab
# Ubuntu는 아래와 같이 옵션을 변경하여야 평문 패스워드 로그인이 가능하다.
sudo sed -i 's/^PasswordAuthentication no$/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
install_pkg.sh
#!/usr/bin/env bash
sudo apt-get update
sudo apt-get install -y nginx
sudo systemctl status nginx
Vagrant up
PS D:\nginx> vagrant up
Vagrant ssh
vagrant ssh
명령으로 생성한 vm환경에 접속, nginx 서비스 상태를 확인합니다.
PS D:\nginx> vagrant ssh
vagrant@nginx-server:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: e>
Active: active (running) since Thu 2023-07-13 05:28:23 UTC; 35s ago
Docs: man:nginx(8)
Main PID: 2868 (nginx)
Tasks: 3 (limit: 1117)
Memory: 5.7M
CGroup: /system.slice/nginx.service
├─2868 nginx: master process /usr/sbin/nginx -g daemon on; master_pr>
├─2869 nginx: worker process
└─2870 nginx: worker process
Nginx 접속 테스트
http://localhost
nginx 기본 서비스 포트인 80포트로 접속이 되지 않습니다. 이유는 vm가상환경에 포트포워드(forwarded_port) 설정이 되어있지 않기 때문입니다.
포트포워드는 VM을 실행하는 host에서 가상환경(guest)으로 포트를 오픈하여 네트워크를 연결하는 역할을 합니다.
Vagrant destroy
생성한 vm을 지우고 Vagrantfile에 forwarded_port
옵션을 추가한 뒤 다시 실행합니다.
PS D:\nginx> 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
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
config.vm.host_name = "nginx-server"
config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.provision "shell", path: "config.sh"
config.vm.provision "shell", path: "install_pkg.sh"
end
- 수정 후 vagrant up
Nginx 접속 테스트
본 블로그에서는 간단한 코드를 통해 VM 환경을 구성하고 Nginx를 설치하는 예제를 다루었습니다.
다음 블로그에서는 Vagrant에서 VM의 네트워크 구성방법과 복수 가상머신 생성방법등을 알아보겠습니다.
Reference
https://developer.hashicorp.com/vagrant/docs
'DevOps' 카테고리의 다른 글
JetBrains IntelliJ Google Style Linter 적용하기 (0) | 2023.06.25 |
---|---|
JetBrains IntelliJ Spring boot - Dev tools 적용시키는 법 (0) | 2023.06.24 |
JetBrains IntelliJ 콘솔로그 한글 깨짐 문제 처리 (0) | 2023.06.23 |
Redis - 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다. or Could not connect to Redis at REMOTE.IP:6379: Connection refused (0) | 2023.04.05 |
Vagrant - Ubuntu 가상환경 구동시 오류(Timed out while waiting for the machine to boot) (0) | 2023.04.05 |