티스토리 뷰

Cloud/Private Cloud

vagrant

Jacob_baek 2019. 5. 6. 17:42

vagrant란?

vagrant 홈페이지 첫 페이지에 나와있는 "Development Environments made easy"라는 문구에서 볼수 있듯이 손쉽게 개발 환경을 만들수 있게 도와주는 도구이다. 실제로 개발에 사용된 application이 설치되어 있거나 혹은 빈 Virtual Machine을 손쉽게 만들어서 개발에 사용할 수 있도록 해준다.

https://www.vagrantup.com/

vagrant 사용법

ubuntu 19.04 를 laptop으로 사용하는 환경에서 KVM을 hypervisor로 하여 진행

아래와 같은 명령을 참고하여 사용한다.

vagrant box list
vagrant init
vagrant up
vagrant status
vagrant halt
vagrant destroy

만약 qemu-kvm을 Hypervisor로 사용하고자 할 경우 아래와 같은 옵션을 추가하여 사용한다.

vagrant up --provider=libvirt

- https://stackoverflow.com/questions/42155213/using-vagrant-to-set-up-a-vm-with-kvm-qemu-without-virtualbox

참고해야 할 것은 Hypervisor를 qemu-kvm을 사용하는 경우 지원되는 image가 제한적이다.
아래 링크를 참고하여 지원되는 hypervisor를 확인한후 사용을 권장한다.
- https://app.vagrantup.com/boxes/search

또한 참고할 것은 public network 의 경우 macvlan type으로 생성됨을 참고하여 network 설정을 진행하는것을 권장한다.
- https://github.com/vagrant-libvirt/vagrant-libvirt#networks

처음 별도의 설정없이 실행하면 아래와 같이 기본 vagrant user로 생성되며

...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Configuring and enabling network interfaces...
    default: SSH address: 192.168.121.129:22
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Rsyncing folder: /home/jacob/ => /vagrant

아래와 같이 vagrant command를 이용하여 shell을 사용할 수 있다.

jacob@jacob-laptop:~$ vagrant ssh
[vagrant@localhost ~]$

기본적으로 사용자계정의 home directory에 .vagrant.d directory에 insecure_private_key를 생성하여 연결을 시도하기에 이를 직접 선택하여 아래와 같이 연결할 수도 있다.

ssh -i ~/.vagrant.d/insecure_private_key vagrant@192.168.122.245

vagrant로 status를 확인하면 현재 vagrant를 통해 동작중인 vm의 정보를 확인할 수 있으며 해당 이름을 사용하여 destroy를 수행할수도 있다.

jacob@jacob-laptop:~$ vagrant status
Current machine states:

default                   running (libvirt)

The Libvirt domain is running. To stop this machine, you can run
`vagrant halt`. To destroy the machine, you can run `vagrant destroy`.
jacob@jacob-laptop:~$ vagrant destroy default
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Removing domain...

별도의 user / password를 사용하고자 할 경우 home directory에 Vagrantfile 파일이 있고 관련 내용을 변경하면 된다.
일반적으로 vagrant ssh config 설정은 다음과 같이 passwordauthentication 이 no로 설정되어 있다.

jacob@jacob-laptop:~/workspaces/provision-jira$ vagrant ssh-config
Host default
  HostName 192.168.121.74
  User root
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentitiesOnly yes
  LogLevel FATAL

하여 다음 링크를 참고하여 이를 변경하여야 사용이 가능하다.

config.vm.provision "shell", inline: <<-SHELL
  sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config    
  systemctl restart sshd
SHELL

반복적인 작업을 수행해야 할 경우 아래와 같이 변수를 할당받아 수행할 수 있다.

Vagrant.configure("2") do |config|

  config.vm.box_check_update = true
  config.vm.synced_folder '/mnt/c/shared/vagrant', '/vagrant'

  ## 2 ubuntu VMs 
  (10..11).each do |i|
    config.vm.define "ubuntu#{i}" do | ubuntu |
      ubuntu.vm.box = "bento/ubuntu-18.04"
      ubuntu.vm.hostname = "ubuntu#{i}"
      ubuntu.vm.network "private_network", ip: "192.168.50.#{i}"
    end
  end 

- https://stackoverflow.com/questions/45841206/how-to-enable-password-ssh-authentication-for-vagrant-vm

또한 ansible module 중 authorized_key 라는 module이 있고 이를 활용하여 자신의 public key를 추가하여 사용할 수도 있다.
- https://www.jacobbaek.com/796

참고로 Virtualbox를 사용하는 경우 config.vm.network "private_network" 을 필히 지정하는것이 좋다.
이유는 Virtualbox는 NAT 모드를 사용하는 interface를 기본으로 생성하고 이는 외부로는 연결되지만 host(즉, laptop 및 desktop 으로 실제 vagrant를 통해 VM을 실행하는 주체)에서는 연결이 되지 않기에 확인이 불가하기 때문이다.
private_network을 통해 host-only interface를 추가하여 사용하는것이 좋다.

How to use Vagrant in WSL

WSL 에서는 vagrant 사용을 위해 windows용과 ubuntu 용을 버전을 동일하게 하여 설치해야 한다.
(지금 가정하는 환경은 WSL에서 vagrant 명령을 수행하는 방법이다.)

==> ubuntu20: Booting VM...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "4b2d2eda-4705-49d0-9c2d-a0e89a265fc2", "--type", "headless"]

Stderr: VBoxManage.exe: error: RawFile#0 failed to create the raw output file /dev/null (VERR_PATH_NOT_FOUND)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

아래와 같은 line을 추가하여야 한다.

Vagrant.configure("2") do |config|
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 8192
    vb.cpus = 4
    vb.gui = false
    vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]  #<====
  end

아래와 같은 line에 대한 설명이 나와있다.

config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
config.vm.synced_folder ".", "/vagrant", disabled: true
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]

다양한 provision 을 통한 Vagrantfile 관리

shell, ansible, ansible_local, salt, docker 등 다양한 방식으로 vagrantfile을 변경하여 application 및 Service를 손쉽게 VM에 provision할수 있다.

참고사항으로 WSL에서 virtualbox를 이용한 virtualmachine을 생성한 경우 host-only network interface를 사용하는 경우 연결이 엄청나게 느린 경우가 있었다. 정확한 원인 분석은 되지 안았지만 workaround로 아래와 같은 inventory 정보를 참고하여

jacob@dubaekPC:~/workspace/vagrants/ubuntu20-deploy$ cat .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory
# Generated by Vagrant

ubuntu20 ansible_host=127.0.0.1 ansible_port=2222 ansible_user='vagrant' ansible_ssh_private_key_file='/home/jacob/workspace/vagrants/ubuntu20-deploy/.vagrant/machines/ubuntu20/virtualbox/private_key'

localhost에 특정 ssh port로 연결하는 방식을 사용하여 느리지 않은 연결을 수행해볼수 있다.

참고로 Windows 환경에서는 다음과 같은 powershell 명령을 통해 listen 되고 있는 port를 확인해볼수도 있다.

PS Microsoft.PowerShell.Core\FileSystem::\\wsl$\Ubuntu-20.04\home\jacob> netstat -nat | select-string 127.0.0.1

  TCP    127.0.0.1:2200         0.0.0.0:0              LISTENING       InHost
  TCP    127.0.0.1:2222         0.0.0.0:0              LISTENING       InHost
  TCP    127.0.0.1:10530        0.0.0.0:0              LISTENING       InHost
  TCP    127.0.0.1:10531        0.0.0.0:0              LISTENING       InHost
  TCP    127.0.0.1:25340        0.0.0.0:0              LISTENING       InHost
  TCP    127.0.0.1:25340        127.0.0.1:49762        ESTABLISHED     InHost
  TCP    127.0.0.1:31026        0.0.0.0:0              LISTENING       InHost
  TCP    127.0.0.1:31027        0.0.0.0:0              LISTENING       InHost
  TCP    127.0.0.1:49762        127.0.0.1:25340        ESTABLISHED     InHost
  UDP    127.0.0.1:59312        *:*

VAGRANT_EXPERIMENT

cloud-init을 사용하는 법이 나와있고 이를 활용할 수 있다.

  • https://www.vagrantup.com/docs/cloud-init/usage
    하지만 실제 사용해본 결과 아래와 같이 cloud-init 설치가 안되어 있어 에러가 발생된다.

    ==> centos7: Machine booted and ready!
    cloud-init is not found. Please ensure that cloud-init is installed and
    available on path for guest 'centos7'.

즉, vagrant box image내에 cloud-init 자체가 있어야 하는데 image내에 cloud-init이 없다보니 이를 사전에 설치하지 않는 경우는 사용이 불가했다. 즉, image box에서 자체적으로 제공하지 않는 경우 box image를 새로 만들어서 사용해야 한다.

참고사이트

https://linuxize.com/post/how-to-install-vagrant-on-ubuntu-18-04/

'Cloud > Private Cloud' 카테고리의 다른 글

Vagrant with VirtualBox in Ubuntu 19.04  (0) 2019.05.12
vagrant with Ansible  (0) 2019.05.09
nested virtualization enable on Red Hat Virtualization  (0) 2018.10.31
How to analysis for Soure Code  (0) 2018.08.30
ansible set_fact  (0) 2018.06.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함