Vagrant: что, как и зачем

При первом знакомстве с Vagrant — это некий cli для VirtualBox. На самом деле, Vagrant представляет собой нечто куда большее. В частности, помимо VirtualBox есть немало других так называемых провайдеров — VMWare, Amazon EC2, LXC и libvirt.

Для каких задач может пригодиться Vagrant?

  • Вам просто нравится CLI и нужна виртуальная машина чтобы с чем-то там поиграться;
  • Такой жесткий способ изолировать ненадежное, например, в плане безопасности, приложение ото всей остальной системы;
  • Быстрый способ развернуть на сервере какой-нибудь готовый LAMP ценой накладных расходов на виртуализацию;
  • Проверить, как ведет себя распределенное приложение при сетевых проблемах и падении машин;
  • Еще при тестировании удобно иметь какой-то начальный образ системы, к которому можно откатиться перед следующим прогоном тестов;
  • Иногда выгоднее купить одну жирную тачку и разместить на ней несколько ВМ, чем покупать несколько физических машин;
  • В ряде случаев с Vagrant’ом намного удобнее мигрировать приложение с хоста на хост (в частности, передать сайт другому владельцу);
  • Как замена deb- и rpm-пакетам, которая умеет разрешать конфликты зависимостей всяких криво написанных приложений, как бы создавая для них «песочницы»;
  • Вы сидите под Ubuntu, а вам для решения каких-то задач иногда нужна другая ОС — CentOS, FreeBSD, OpenBSD или Windows;

Я приведу пример конфигурации одного из моих проектов, кому интересно прошу под кат

Структура проекта выглядит примерно так:

- django_project - джанго проект
- deploybox/
|
- playbooks/
- roles/
|
- nginx/
- django/
- postgresql/
|
- roles/
|
- pg_hba.conf
- postgresql.conf
- vagrantbox.sh - файл для сборки виртуальной машины
- requirements.txt - зависимости для python
- Vagrantfile - Файл бокс

Vagrantfile

Почитать полную документацию можно на сайте проекта

# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|  
  config.vm.box = "geerlingguy/ubuntu1604"
config.vm.provision :shell, :path => "./deploybox/vagrantbox.sh"
config.vm.network "private_network", ip: "192.168.33.33"
  config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--memory", "1024"]
vb.name = "ubuntu-django"
end
end

vagrantbox.sh

#!/usr/bin/env bash
export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
locale-gen en_US.UTF-8
dpkg-reconfigure locales
# Установка базовых пакетов
sudo apt-get update
sudo apt-get -y install mc python3-dev python3-setuptools python3-pip git-core libpq-dev libxml2-dev libxslt-dev libfontconfig1
sudo easy_install3 -U pip
sudo pip3 install -r /vagrant/requirements.txt
# Установка PostgreSQL
sudo apt-get -y install postgresql postgresql-contrib
sudo cp /vagrant/deploybox/roles/postgresql/files/pg_hba.conf /etc/postgresql/9.5/main/
sudo cp /vagrant/deploybox/roles/postgresql/files/postgresql.conf /etc/postgresql/9.5/main/
sudo service postgresql restart
cat << EOF | su - postgres -c psql
-- Create the database user:
CREATE USER dbuser WITH PASSWORD 'password';
-- Create the database:
CREATE DATABASE test_db WITH OWNER=dbuser
LC_COLLATE='en_US.utf8'
LC_CTYPE='en_US.utf8'
ENCODING='UTF8'
TEMPLATE=template0;
EOF
# Установка Redis
sudo apt-get -y install redis-server
sudo service redis-server restart
# И т.д.

И контроль за виртуалками. Покажет все ВМ и их состояние.

vagrant global-status

Если ВМ удалялась не через Vagrant, она может остаться в global-status. Лечится это так:

vagrant global-status --prune

Виртуалки можно ставить на паузу:

vagrant suspend 1f2a1a5
vagrant resume ubuntu1

Можно использовать не полный id вируталки (1f2a1a5), а только его начало (например, 1f). Кроме того, если вы присвоили ВМ имена, как было описано выше, то можно использовать их.

Полная останова и запуск:

vagrant halt 1f
vagrant up 1f

Удаление ВМ:

vagrant destroy 1f