본문 바로가기
DevOps/IaC 자동화

[Vagrant] 사용법 및 CentOS Provisioning 기본 구축, Vagrant란?

by 🌻♚ 2020. 12. 19.

Vagrant? Provisioning?

Vagrant는 Provisioning을 위한 툴입니다. 그럼 Provisioning이 뭘까요? 제가 정의하는 Provisioning은 시스템을 미리 코드화하여 언제든지 즉시 시스템을 구성할 수 있도록 하는 것 입니다. 예를 들어 Virtual box를 사용해서 가상머신을 생성하는데 필요한 메모리, cpu, 네트워크를 정의하고 시스템에 필요한 패키지를 설치 혹은 환경설정을 미리 코드화하여 서버를 생성할 준비할 수 있습니다.

 

Vagrant를 사용하면 주기적으로 서버를 배포하고 새롭게 환경은 적용할 필요가 있을 때 유용하게 사용될 수 있습니다. 각각 다른 서비스의 테스트환경을 구축하거나, 학습이나 단기적으로 사용에 필요할 수 있습니다.

 

Vagrant 설치

 

Vagrant by HashiCorp

Vagrant enables users to create and configure lightweight, reproducible, and portable development environments.

www.vagrantup.com

Vagrant 홈페이지를 이용해서 운영체제에 맞게 설치한다.

 

Virtual box

 

Oracle VM VirtualBox

Welcome to VirtualBox.org! News Flash Important November 16th, 2020We're hiring! Looking for a new challenge? We're hiring a VirtualBox senior developer in 3D area (Europe/Russia/India). Important October 27th, 2020We're hiring! Looking for a new challenge

www.virtualbox.org

실습을 위해 Virtual box를 설치해줍니다.

 

 

Vagrant 실습

vagrant init

vagrant init

vagrant init 명령을 실행하면 Vagrantfile을 예시로 하나 생성해줍니다

 

Vagrantfile

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

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "base"

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine and only allow access
  # via 127.0.0.1 to disable public access
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Enable provisioning with a shell script. Additional provisioners such as
  # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end

해당 Vagrantfile을 수정하여 provisioning을 진행합니다.

 

vagrant up

 

그럼 2개의 CentOS 서버를 provisioning해보겠습니다.

vagrant up

 

Vagrantfile

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

Vagrant_API_Version = "2"
Vagrant.configure(Vagrant_API_Version) do |config|
  #test01
  config.vm.define:"test01" do |cfg|
    config.vm.box = "centos/7"
    cfg.vbguest.auto_update = false
    cfg.vm.provider:virtualbox do |vb|
      vb.name="CentOS-test01"
      vb.customize ["modifyvm", :id, "--cpus",1]
      vb.customize ["modifyvm", :id, "--memory",1024]
    end
    cfg.vm.host_name="test01"
    cfg.vm.synced_folder ".", "/vagrant", disabled:true
    cfg.vm.network "public_network", ip: "222.111.71.201"
    cfg.vm.network "forwarded_port", guest: 22, host:39211, auto_correct: false, id: "ssh"
  end
  #test02
  config.vm.define:"test02" do |cfg|
    config.vm.box = "centos/7"
    cfg.vbguest.auto_update = false
    cfg.vm.provider:virtualbox do |vb|
      vb.name="CentOS-test02"
      vb.customize ["modifyvm", :id, "--cpus",1]
      vb.customize ["modifyvm", :id, "--memory",1024]
    end
    cfg.vm.host_name="test02"
    cfg.vm.synced_folder ".", "/vagrant", disabled:true
    cfg.vm.network "public_network", ip: "222.111.71.202"
    cfg.vm.network "forwarded_port", guest: 22, host:39212, auto_correct: false, id: "ssh"
  end
end

서버의 시스템 환경을 직접 코드화하여 서버를 생성할 수 있습니다. 코드의 내용은 ruby로 되어 있고 가시성이 좋아 이해하기 쉽게 구성되어 있습니다.

config.vm.define vagrant 명령어를 사용할때 이용될 tag입니다.
config.vm.box provisioning할 운영체제를 선택합니다. 해당 운영체제의 정보들은 app.vagrantup.com/boxes/search에서 확인 가능
cfg.vbguest.auto_update No package kernel-devel-3.10.0-1127.el7.x86_64 available.
kernal 관련된 오류 발생한다면 해당 값을 false로 지정해줍니다.
vb.name 가상 머신의 이름을 지정
vb.customize 가상머신의 스펙을 지정
cfg.vm.host_name hostname 지정
cfg.vm.synced_folder host와 사용하게될 공유폴더를 지정할 수 있습니다.
cfg.vm.network 네트워크에 대한 설정

정의한 코드 내용대로 provisioning이 진행됩니다. 중간에 네트워크에 대한 설정이 있을 수 있습니다.

 

Virtualbox를 확인해보면 provisioning을 진행한 가상머신이 올라온 것을 확인할 수 있습니다.

 

 

vagrant provision

vagrant provision

해당 명령을 사용해서 서버의 변경사항을 적용하여 provisioning을 진행합니다.

 

init.sh

#! /bin/bash

# install useful packages
yum install net-tools -y
yum install vim -y

파일을 하나 생성해서 각 host에 반영할 파일을 생성해줍니다.

 

Vagrantfile

#test01
  config.vm.define:"test01" do |cfg|
    config.vm.box = "centos/7"
    cfg.vbguest.auto_update = false
    cfg.vm.provider:virtualbox do |vb|
      vb.name="CentOS-test01"
      vb.customize ["modifyvm", :id, "--cpus",1]
      vb.customize ["modifyvm", :id, "--memory",1024]
    end
    cfg.vm.host_name="test01"
    cfg.vm.synced_folder ".", "/vagrant", disabled:true
    cfg.vm.network "public_network", ip: "222.111.71.201"
    cfg.vm.network "forwarded_port", guest: 22, host:39211, auto_correct: false, id: "ssh"
    cfg.vm.provision "shell", path: "init.sh"
  end

cfg.vm.provision 옵션을 추가해서 생성한 init.sh를 실행해주겠습니다.

 

vagrant provision test01

test01 tag를 이용해서 해당 host만 provisioning을 진행하겠습니다.

 

 

vagrant ssh

vagrant ssh test01

해당 서버로 붙을 수 있습니다. 기본적으로 root, vagrant 2개 계정이 있고 모두 'vagrant'라는 비밀번호를 갖고 있습니다.

 

 

vagrant halt

vagrant halt

Vagrantfile에 정의되어 있는 모든 host를 종료시킵니다.

 

 

vagrant destroy

vagrant destroy

Vagrantfile에 정의되어 있는 모든 host의 가상머신을 삭제합니다.

태그

댓글0