본문 바로가기
DevOps

Vagrant 사용법 - Ubuntu + Nginx 환경 구성하기

by 맑은안개 2023. 7. 13.

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

 

Vagrant Cloud by HashiCorp

Vagrant Cloud by HashiCorp

app.vagrantup.com

 

접속하여 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프로그램을 실행

  1. config.sh - os 설정 shell
  2. 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

 

Documentation | Vagrant | HashiCorp Developer

Welcome to the documentation for Vagrant - the command line utility for managing the lifecycle of virtual machines. This website aims to document every feature of Vagrant from top-to-bottom, covering as much detail as possible.

developer.hashicorp.com

 

반응형