Vagrant
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.
Для использования forwarded_port не обязательно получать ip и присоединяться к виртуальной сети,
это работает и без b2.vm.network "public_network"
.
На сервер backend-2 устанавливается Nginx, который доступен с backend-1, по порту 7070 на host системе и по vm-ip:80 с host системы напрямую.
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.
# -*- 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
vagrant box list
Работа с образами виртуальных машин
vagrant box add my-box file:///x:/path/to/my-box.box
Создание и доступ в среде
vagrant validate
vagrant up [name|id]
vagrant status [name|id]
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