Vagrant. Начало работы. Часть 1 из 2

20.11.2019

Теги: CLILinuxUbuntuVagrantWeb-разработкаWindowsВиртуализацияНастройкаУстановка

Vagrant — консольная утилита, которая управляет виртуальными машинами. По умолчанию Vagrant работает с системой виртуализации VirtualBox. Такая связка доступна в операционных системах Windows, Mac и Linux.

В директории проекта надо создать файл Vagrantfile с описанием конфигурации виртуальной машины. В нем указывается операционная система, выделяемые ресурсы, сетевые настройки и скрипты по установке дополнительных программ. Команда vagrant up создает и запускает виртуальную машину. Во время ее работы директория проекта синхронизируется между основной операционной системой и операционной системой виртуальной машины.

Итак, устанавливаем VurtualBox и Vagrant. Для проверки, что установка прошла успешно:

$ cd d:/vagrant/www
$ vagrant -v
Vagrant 2.2.6
Все команды будем выполнять в git bash (командная строка с стиле linux), которая устанавливается вместе с Git для Windows.

Создание Vagrantfile

Теперь создадим файл конфигурации:

$ vagrant init -m ubuntu/bionic64
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.
Использование ключа -m или --minimal позволяет создать файл Vagrantfile минимального размера, без комментариев. Есть смысл использовать команду без этого ключа и прочитать комментарии — там много интересного.

Посмотрим на файл Vagrantfile:

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/bionic64"
end

При создании Vagrantfile мы указали название бокса ubuntu/bionic64. Бокс — это образ операционной системы, который так же может содержать установленные программы (LAMP, Python и т.д). Подходящий бокс можно найти на сайте Vagtant Cloud. Разработчики Vagrant рекомендуют использовать образы Bento.

В принципе, этого достаточно, чтобы создать виртуальную машину. Но давайте немного доработаем конфигурацию:

Vagrant.configure(2) do |config|
  # образ системы Ubuntu 18/04 LTS (Bionic Beaver)
  config.vm.box = "bento/ubuntu-18.04"
  # не проверять репозиторий на наличие обновлений
  config.vm.box_check_update = false

  config.vm.provider "virtualbox" do |vb|
    # имя виртуальной машины
    vb.name = "ubuntu-1804-test"
    # объем оперативной памяти
    vb.memory = 2048
    # количество ядер процессора
    vb.cpus = 1
  end
  
  # hostname виртуальной машины
  config.vm.hostname = "ubuntu-1804-test"
end

Создаем виртуальную машину. В первый раз процесс займет больше времени, Vagrant должен скачать образ с операционной системой.

$ vagrant up

Остановить виртуальную машину можно командой

$ vagrant halt

Чтобы посмотреть справку по всем командам:

$ vagrant --help
Usage: vagrant [options] <command> [<args>]

    -v, --version                    Print the version and exit.
    -h, --help                       Print this help.

Common commands:
     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
     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`.

Настройка сети

Два сетевых интерфейса: NAT + Bridged

Отредактируем файл Vagrantfile:

Vagrant.configure(2) do |config|
  # образ системы Ubuntu 18/04 LTS (Bionic Beaver)
  config.vm.box = "bento/ubuntu-18.04"
  # не проверять репозиторий на наличие обновлений
  config.vm.box_check_update = false

  config.vm.provider "virtualbox" do |vb|
    # имя виртуальной машины
    vb.name = "ubuntu-1804-test"
    # объем оперативной памяти
    vb.memory = 2048
    # количество ядер процессора
    vb.cpus = 1
  end
  
  # hostname виртуальной машины
  config.vm.hostname = "ubuntu-1804-test"
  # настройка сети (сетевой мост на втором интерфейсе)
  config.vm.network "public_network"
end

И запустим виртуальную машину:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/ubuntu-18.04'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: ubuntu-1804-test
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: bridged
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => D:/vagrant/www

Зайдем на виртуальную машину по ssh (по ключу):

$ vagrant ssh
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Nov 23 04:49:36 UTC 2019

  System load:  0.41              Processes:           91
  Usage of /:   2.5% of 61.80GB   Users logged in:     0
  Memory usage: 5%                IP address for eth0: 10.0.2.15
  Swap usage:   0%                IP address for eth1: 192.168.110.14

 * Overheard at KubeCon: "microk8s.status just blew my mind".

     https://microk8s.io/docs/commands#microk8s.status

0 packages can be updated.
0 updates are security updates.

This system is built by the Bento project by Chef Software
More information can be found at https://github.com/chef/bento/README.md

И посмотрим сетевые интерфейсы:

$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::a00:27ff:fe6d:95c4  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:6d:95:c4  txqueuelen 1000  (Ethernet)
        RX packets 1745  bytes 687041 (687.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1048  bytes 160253 (160.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.110.14  netmask 255.255.255.0  broadcast 192.168.110.255
        inet6 fe80::a00:27ff:febc:4f40  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:bc:4f:40  txqueuelen 1000  (Ethernet)
        RX packets 1614  bytes 97406 (97.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1728 (1.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 20  bytes 1776 (1.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20  bytes 1776 (1.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

У нас их два: eth0 (NAT, добавляется автоматически) и eth1 (сетевой мост, по нашему требованию). Виртуальная машина теперь является частью той же сети, что и хост-система и получает ip-адрес от роутера, на котором запущена служба DHCP.

Два сетевых интерфейса: NAT + Hostonly

Отредактируем файл Vagrantfile:

Vagrant.configure(2) do |config|
  # образ системы Ubuntu 18/04 LTS (Bionic Beaver)
  config.vm.box = "bento/ubuntu-18.04"
  # не проверять репозиторий на наличие обновлений
  config.vm.box_check_update = false

  config.vm.provider "virtualbox" do |vb|
    # имя виртуальной машины
    vb.name = "ubuntu-1804-test"
    # объем оперативной памяти
    vb.memory = 2048
    # количество ядер процессора
    vb.cpus = 1
  end
  
  # hostname виртуальной машины
  config.vm.hostname = "ubuntu-1804-test"
  # настройки сети
  config.vm.network "private_network", type: "dhcp"
end

И запустим виртуальную машину:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/ubuntu-18.04'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: ubuntu-1804-test
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => D:/vagrant/www

Зайдем на виртуальную машину по ssh (по ключу):

$ vagrant ssh
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Nov 23 06:00:25 UTC 2019

  System load:  0.0               Processes:           88
  Usage of /:   2.5% of 61.80GB   Users logged in:     0
  Memory usage: 5%                IP address for eth0: 10.0.2.15
  Swap usage:   0%                IP address for eth1: 172.28.128.3

 * Overheard at KubeCon: "microk8s.status just blew my mind".

     https://microk8s.io/docs/commands#microk8s.status

0 packages can be updated.
0 updates are security updates.

This system is built by the Bento project by Chef Software
More information can be found at https://github.com/chef/bento/README.md

И посмотрим сетевые интерфейсы:

$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::a00:27ff:fe6d:95c4  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:6d:95:c4  txqueuelen 1000  (Ethernet)
        RX packets 1473  bytes 653711 (653.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 847  bytes 126122 (126.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.28.128.3  netmask 255.255.255.0  broadcast 172.28.128.255
        inet6 fe80::a00:27ff:fefc:1a31  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:fc:1a:31  txqueuelen 1000  (Ethernet)
        RX packets 43  bytes 5179 (5.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 15  bytes 1698 (1.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 20  bytes 1776 (1.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20  bytes 1776 (1.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

У нас их два: eth0 (NAT, добавляется автоматически) и eth1 (виртуальный адаптер хоста, по нашему требованию). У виртуальной машины есть выход в интернет через NAT и она в одной сети с хост-системой.

  • ip-адрес виртуальной машины 172.28.128.3
  • ip-адрес DHCP-сервера 172.28.128.2
  • ip-адрес хост-системы 172.28.128.1

Подключение по ssh

По умолчанию подключиться к виртуальной машине можно с помощью команды

$ vagrant ssh

При этом используются ssh-ключи, которые Vagrant добавляет на этапе создания виртуальной машины. Если по каким-то причинам это не устраивает, можно задать имя пользователя и пароль для входа. Тогда можно будет входить как с использованием логина и пароля, так и с использованием ssh-ключей.

Vagrant.configure(2) do |config|
  # образ системы Ubuntu 18/04 LTS (Bionic Beaver)
  config.vm.box = "bento/ubuntu-18.04"
  # не проверять репозиторий на наличие обновлений
  config.vm.box_check_update = false
  # имя пользователя
  config.ssh.username = 'vagrant'
  # пароль пользователя
  config.ssh.password = 'vagrant'
  # можно подключаться по паролю
  config.ssh.keys_only = false

  config.vm.provider "virtualbox" do |vb|
    # имя виртуальной машины
    vb.name = "ubuntu-1804-test"
    # объем оперативной памяти
    vb.memory = 2048
    # количество ядер процессора
    vb.cpus = 1
  end
  
  # hostname виртуальной машины
  config.vm.hostname = "ubuntu-1804-test"
end

Подключиться с использованием логина и пароля:

$ ssh -p2222 vagrant@127.0.0.1
The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:2222' (ECDSA) to the list of known hosts.
vagrant@127.0.0.1's password: vagrant

Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Nov 23 10:27:52 UTC 2019

  System load:  0.08              Processes:           88
  Usage of /:   2.5% of 61.80GB   Users logged in:     0
  Memory usage: 5%                IP address for eth0: 10.0.2.15
  Swap usage:   0%

 * Overheard at KubeCon: "microk8s.status just blew my mind".

     https://microk8s.io/docs/commands#microk8s.status

0 packages can be updated.
0 updates are security updates.

This system is built by the Bento project by Chef Software
More information can be found at https://github.com/chef/bento/README.md
Last login: Sat Nov 23 10:17:43 2019

Или просто запустить виртуальную машину и ввести логин-пароль:

По поводу ssh-ключей

В более ранних версиях Vagrant для подключения к виртуальной машине использовался ключ ~/.vagrant.d/insecure_private_key. Но теперь Vagrant выдает предупреждение, что обнаружен небезопасный ключ и заменяет его:

==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!

Этот ключ расположен в где-то в недрах директрории .vagrant (создается после первого запуска vagrant up). Посмотреть, какой ключ будет использован, можно с помощью команды:

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile D:/vagrant/www/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

Можно отменить создание ssh-ключа, если добавить в файл конфигурации config.ssh.insert_key = false:

Vagrant.configure(2) do |config|
  # образ системы Ubuntu 18/04 LTS (Bionic Beaver)
  config.vm.box = "bento/ubuntu-18.04"
  # не проверять репозиторий на наличие обновлений
  config.vm.box_check_update = false
  # отменить создание ssh-ключа
  config.ssh.insert_key = false

  config.vm.provider "virtualbox" do |vb|
    # имя виртуальной машины
    vb.name = "ubuntu-1804-test"
    # объем оперативной памяти
    vb.memory = 2048
    # количество ядер процессора
    vb.cpus = 1
  end
  
  # hostname виртуальной машины
  config.vm.hostname = "ubuntu-1804-test"
end

Поиск: CLI • Linux • Ubuntu • Web-разработка • Windows • Виртуальная машина • Настройка • Установка • Vagrant

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.