Vagrant로 여러 VM 시작

9814 단어 Vagrant
Vagrant로 1대의 VM을 올리는 것은 특별히 문제 없지만, 2대 이상의 VM을 시작하고 싶을 때는 어떻게 하면…
가 되었으므로, 조사해 시험해 보았다.

검증 환경


  • macOS Mojave
  • Vagrant 2.2.2
  • VirtualBox 5.2.22

  • 참고



    공식 문서에 예가 실려 있었기 때문에, 이것을 보면서 바삭하게 흉내내 보았다.
    Multi-Machine - Vagrant by HashiCorp

    Vagrantfile 만들기



    box는 ubuntu/bionic64를 사용.
    $ vagrant init ubuntu/bionic64
    $ vi Vagrantfile
    

    문서에서는 provisioning라든지 쓰거나 VM마다 box를 바꾸거나 하고 있는 것 같았지만, 단순히 같은 box로 2대 기동하는 것만이라면 이런 느낌으로 OK였다.
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    Vagrant.configure("2") do |config|
      config.vm.box = "ubuntu/bionic64"
      config.vm.define "machine_a"
      config.vm.define "machine_b"
    
      config.vm.provider "virtualbox" do |vb|
        # Display the VirtualBox GUI when booting the machine
        vb.gui = false
    
        # Customize the amount of memory on the VM:
        vb.memory = "2048"
        vb.cpus = "1"
      end
    end
    

    메모리라든지 CPU의 설정은 기호로. config.vm.define 로 VM을 복수 정의할 수 있다.

    시작



    시작은 항상 vagrant up 에서.
    $ vagrant up
    Bringing machine 'machine_a' up with 'virtualbox' provider...
    Bringing machine 'machine_b' up with 'virtualbox' provider...
    ==> machine_a: Importing base box 'ubuntu/bionic64'...
    ==> machine_a: Matching MAC address for NAT networking...
    
    (略)
    
    ==> machine_b: Importing base box 'ubuntu/bionic64'...
    ==> machine_b: Matching MAC address for NAT networking...
    
    (略)
    
        machine_b: Inserting generated public key within guest...
        machine_b: Removing insecure key from the guest if it's present...
        machine_b: Key inserted! Disconnecting and reconnecting using new SSH key...
    ==> machine_b: Machine booted and ready!
    
    (略)
    

    정의한 machine_a 다음에 machine_b가 시작되는 모습. vagrant status 에서 확인.
    $ vagrant status
    Current machine states:
    
    machine_a                 running (virtualbox)
    machine_b                 running (virtualbox)
    
    This environment represents multiple VMs. The VMs are all listed
    above with their current state. For more information about a specific
    VM, run `vagrant status NAME`.
    

    오르고 있는 것 같다. VM에 들어갈 때는 단순히 vagrant ssh 그냥 하면 "여러가지 있기 때문에 이름 지정하라!"라는 화가 나기 때문에 vagrant ssh <VM名>
    $ vagrant ssh
    This command requires a specific VM name to target in a multi-VM environment.
    $ vagrant ssh machine_a
    Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-39-generic x86_64)
    
     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage
    
      System information as of Mon May  6 07:42:41 UTC 2019
    
    (略)
    

    네트워크 설정



    이대로라면 기동한 VM끼리 소통을 취할 수 없기 때문에, 네트워크의 설정을 변경해 서로 같은 세그먼트(segment)로 기동하도록(듯이) 한다. config.vm.define 블록에서 각 VM의 IP를 구성합니다.
    덧붙여서 네트워크의 설정에 대해서는 이쪽을 참조.
    Networking - Vagrant by HashiCorp
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    Vagrant.configure("2") do |config|
      config.vm.box = "ubuntu/bionic64"
      # config.vm.network "private_network", type: "dhcp"
    
      config.vm.define "machine_a" do |machine|
        machine.vm.network "private_network", ip: "192.168.1.101"
      end
    
      config.vm.define "machine_b" do |machine|
        machine.vm.network "private_network", ip: "192.168.1.102"
      end
    
      config.vm.provider "virtualbox" do |vb|
        # Display the VirtualBox GUI when booting the machine
        vb.gui = false
    
        # Customize the amount of memory on the VM:
        vb.memory = "2048"
        vb.cpus = "1"
      end
    end
    

    각 VM 내에서 IP를 확인해 봅니다.

    machine_a
    vagrant@ubuntu-bionic:~$ ip a | grep inet
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host
        inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
        inet6 fe80::c2:ccff:fedd:c7b8/64 scope link
        inet 192.168.1.101/24 brd 192.168.1.255 scope global enp0s8
        inet6 fe80::a00:27ff:fe41:d68b/64 scope link
    

    machine_b
    vagrant@ubuntu-bionic:~$ ip a | grep inet
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host
        inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
        inet6 fe80::c2:ccff:fedd:c7b8/64 scope link
        inet 192.168.1.102/24 brd 192.168.1.255 scope global enp0s8
        inet6 fe80::a00:27ff:fe06:6400/64 scope link
    

    ping도 지나가는지 확인.

    machine_a
    vagrant@ubuntu-bionic:~$ ping 192.168.1.102
    PING 192.168.1.102 (192.168.1.102) 56(84) bytes of data.
    64 bytes from 192.168.1.102: icmp_seq=1 ttl=64 time=0.616 ms
    64 bytes from 192.168.1.102: icmp_seq=2 ttl=64 time=0.578 ms
    64 bytes from 192.168.1.102: icmp_seq=3 ttl=64 time=0.617 ms
    64 bytes from 192.168.1.102: icmp_seq=4 ttl=64 time=0.850 ms
    ^C
    --- 192.168.1.102 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3005ms
    rtt min/avg/max/mdev = 0.578/0.665/0.850/0.109 ms
    

    machine_b
    vagrant@ubuntu-bionic:~$ ping 192.168.1.101
    PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
    64 bytes from 192.168.1.101: icmp_seq=1 ttl=64 time=0.225 ms
    64 bytes from 192.168.1.101: icmp_seq=2 ttl=64 time=0.610 ms
    64 bytes from 192.168.1.101: icmp_seq=3 ttl=64 time=0.385 ms
    64 bytes from 192.168.1.101: icmp_seq=4 ttl=64 time=0.833 ms
    ^C
    --- 192.168.1.101 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3047ms
    rtt min/avg/max/mdev = 0.225/0.513/0.833/0.230 ms
    

    좋은 느낌.

    요약



    이것으로 2대 이상의 VM을 시작하는 경우도 Vagrant로 빨리 환경 구축할 수 있을 것 같다. provisioning에 대해서도 공통 처리와 개별의 처리로 나누어 기술할 수 있을 것 같은 느낌이지만, 지금이라면 대체로 Docker로 부족한 것일까, 라고.

    좋은 웹페이지 즐겨찾기