Skip to main content

Vagrant

warning

Warning! Vagrant boxes are insecure by default and by design, featuring public passwords, insecure keypairs for SSH access, and potentially allow root access over SSH. With these known credentials, your box is easily accessible by anyone on your network. Before configuring Vagrant to use a public network, consider all potential security implications and review the default box configuration to identify potential security risks.

Документация и другие ссылки

Vagrant is designed for everyone as the simplest and fastest way to create a virtualized environment

Инструмент для создания и управления виртуализированной средой.

Решаемые задача

  • Позволяет использовать Infrastructure as Code, описать виртуальную среду в виде кода и конфигураций.
  • Vagrant умеет развернуть описанную среду в различных средах виртуализации, так как VirtualBox, VMWare, Hyper-V и даже в Docker.
  • Позволяет настроить сеть в разворачиваемой среде.
  • Настройка среды внутри виртуальной машины может выполняться множеством способов: Shell, Ansible, Chef, Salt ...

Использование

Описание виртуальной среды. Vagrantfile

В описании инфраструктуры ниже запрашивается две виртуальные машины "backend-1" и "backend-2". Каждая виртуальная машина получает свой ip адрес. Порт 7070 host системы перенаправляется на порт 80 сервера backend-2.

info

Для использования forwarded_port не обязательно получать ip и присоединяться к виртуальной сети, это работает и без b2.vm.network "public_network".

На сервер backend-2 устанавливается Nginx, который доступен с backend-1, по порту 7070 на host системе и по vm-ip:80 с host системы напрямую.

info

We kind of are, too. It is likely that public networks will be replaced by :bridged in a future release, since that is in general what should be done with public networks, and providers that do not support bridging generally do not have any other features that map to public networks either.

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

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

config.vm.network "private_network", type: "dhcp", netmask: "255.255.255.0", dhcp_ip:"192.168.56.100", dhcp_lower: "192.168.56.101", :dhcp_upper=>"192.168.56.254"

config.vm.define "backend-1" do |b1|
b1.vm.box = "ubuntu/bionic64"

b1.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = "1024"
end

#b1.vm.network "public_network"
b1.vm.hostname = "backend-1"
end

config.vm.define "backend-2" do |b2|
b2.vm.box = "ubuntu/bionic64"

b2.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = "4096"
end

# https://developer.hashicorp.com/vagrant/docs/networking/public_network
#b2.vm.network "public_network"
b2.vm.hostname = "backend-2"
b2.vm.network "forwarded_port", guest: 80, host: 7070, protocol: "tcp"

b2.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install nginx -y
systemctl start nginx
SHELL
end
end

Управление виртуальной средой

Ниже приведены некоторые команды управления окружением. Подробно о командах тут: Command-Line Interface

Статусы

Список всех развернутых сред
vagrant global-status
Список доступных для использования образов VM
vagrant box list

Работа с образами виртуальных машин

Добавить образ из файла
vagrant box add my-box file:///x:/path/to/my-box.box

Создание и доступ в среде

Проверка конфигурации в Vagrantfile
vagrant validate
Создание среды из описания
vagrant up [name|id]
Статус
vagrant status [name|id]
Зайти по ssh в VM
vagrant ssh [name|id]

Удаление

Остановка и освобождение всех занятых ресурсов
vagrant destroy [name|id]

Примеры

Сетевая изоляция виртуальных машин

При использовании config.vm.network "private_network" или config.vm.network "private_network" виртуальные машины остаются доступными по сети. Для того чтобы обьединить несколько виртуальных машин, позволить им взаимодействовать друг с другом и при этом изолировать их от окружающего мира можно использовать фичу VirtualBox “Internal Network”, которая изолирует виртуальную сеть.

В примере ниже мы имеем два сегмента "isolated-segment" и "backend-network". Две VM в сегменте "backend-network" имеют возможность вызывать друг друга, а виртуальная машина "ib1" находится в другом сегменте и не способна обратиться к "ib2" и "ib3". Как и у "ib2","ib3" нет возможности взаимодействовать с "ib1".

Изолированные вируальные машины
# -*- mode: ruby -*-
# vi: set ft=ruby :

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

config.vm.define "solated-backend-1" do |ib1|
ib1.vm.box = "generic/ubuntu2204"
ib1.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = "1024"
end
ib1.vm.hostname = "ib1"

ib1.vm.network "private_network", ip: "192.168.49.2", virtualbox__intnet: "isolated-segment"
end

config.vm.define "solated-backend-2" do |ib2|
ib2.vm.box = "generic/ubuntu2204"
ib2.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = "1024"
end
ib2.vm.hostname = "ib2"

ib2.vm.network "private_network", ip: "192.168.49.3", virtualbox__intnet: "backend-network"
end

config.vm.define "solated-backend-3" do |ib3|
ib3.vm.box = "generic/ubuntu2204"
ib3.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = "1024"
end
ib3.vm.hostname = "ib3

ib3.vm.network "private_network", ip: "192.168.49.4", virtualbox__intnet: "backend-network"
end
end