Тюнингуем Vagrant box

В прошлой заметке я начал разговор об инструменте под названием Vagrant. В этот раз я покажу, как работать с готовой виртуальной машиной, подключаться к ней через ssh, использовать provisioner.

vagrant1

Но перед тем как начать, хочу отметить, что для работы с Vagrant активно используется консоль. Если вы работаете из-под Windows, то я бы рекомендовал перейти на ConsoleZ. Почему? Потому, что она гораздо удобнее, чем стандартная CMD.

Настроили консоль - теперь начнем играться с Vagrant.

Создаем машину:

mkdir vagrant_box
cd vagrant_box
vagrant init ubuntu/trusty64; vagrant up --provider virtualbox

После этого запустится виртуальная машина, а в папке vagrant_box появится файл - Vagrantfile. Собственно в этом файле и кроется вся магия настроек виртуальной машины. Для того чтобы влючить вашу созданную машину в сеть и получать к ней доступ по сети, в Vagrantfile нужно раскомментировать две строчки:

config.vm.network :private_network, ip: "192.168.33.10"
config.vm.network :public_network

Для того, чтобы изменения вступили в силу, нужно в консоли выполнить команду:

vagrant reload

Подключаемся к запущенной машине:

Вы можете подключаться к запущенным виртуальным машинам с помощью команд vagrant ssh и vagrant rdp. Лично я создавал машины на основе Ubuntu, поэтому мой пример будет основан на этом. Находясь в папке vagrant_box, выполните две команды:

vagrant status

Эта команда должна показать, что ваша машина запущена.

vagrant ssh

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

Создаем provision:

Vagrant предоставляет функциональность provisioning. С помощью этой фичи вы можете манипулировать машиной используя puppet, chef или просто shell скрипты. Я покажу пример с использованием shell скриптов. Допустим, вы хотите, чтобы при старте машины у вас устанавливалась java. Вы можете, конечно, каждый раз выполнять одни и те же команды, а можете поступить следующим образом. Открываем Vagrantfile и ищем раздел:

# Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   sudo apt-get update
  #   sudo apt-get install -y apache2
  # SHELL

Если такого нету (а такое бывает), то добавляем этот кусок в наш файл и сохряняем. Для того, чтобы использовать provision для нашего случая с установкой java, мы прописываем следующее:

config.vm.provision "shell", path: "java.sh"

Файл java.sh должен лежать в папке vagrant_box рядом с Vagrantfile. Содержание файла java.sh:

#! /usr/bin/env bash
echo "Installing java 7"
sudo apt-get install -y python-software-properties
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update

# Enable silent install
echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections

sudo apt-get install -y oracle-java7-installer

# Not always necessary, but just in case...
sudo update-java-alternatives -s java-7-oracle

# Setting Java environment variables
sudo apt-get install -y oracle-java7-set-default
echo "Java 7 installation finished"

Если наша машина была запущена, то нужно выполнить команду:

vagrant reload --provision

Для случая с выключенной машиной выполняем:

vagrant up --provision

Теперь при запуске машины будет произведена установка oracle-java-7. Нужно отметить, что существует и другой подход написания скриптов для provision. Можно писать их прямо в Vagrantfile:

config.vm.provision "shell", inline: <<-SHELL
    echo "Start nodejs installation"
    sudo apt-get install -y curl
    curl -sL https://deb.nodesource.com/setup | sudo bash -
    sudo apt-get install -y nodejs
    sudo apt-get install build-essential
    sudo apt-get install -y npm
SHELL

Этот скрипт установит nodejs.

Таким образом вы можете легко и быстро получать виртуальные машины с предустановленным ПО. В целом, поигравшись с Vagrant, могу сказать, что мне эта штука очень понравилась. На моем текущем проекте мы не нуждаемся в виртуальных машинах, но, как только мне выпадет шанс, я обязательно буду его использовать.