Настройка Vagrant

Vagrant – инструмент для создания и конфигурирования, воспроизводимых и переносимых сред разработки.

Крайне полезен для работы командной разработки, а также в случаях работы за разными машинами.

Зачем нужен Vagrant

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

Плюсы применения вагранта:

  • Та же операционка что и на продакшене
  • Софт и пакеты нужных версий, у всех одинаковые, такие же как в продакшене
  • Быстрое начало работы для нового участника команды,
  • Быстрый переход на новый компьютер
  • Контроль изменения конфигурации среды разработки

Дополнительные плюсы:

  • Хост система не захламляется различными компонентами вроде разных версий БД, веб-серверов и прочего,
  • виртуалку проекта можно грохнуть и создать заново: установка занимает от десятков секунд до нескольких минут (в зависимости от скрипта установки проекта).

Как установить Vagrant

  • Скачать и установить Vagrant: https://www.vagrantup.com/downloads.html
  • Скачать и установить Virtualbox: https://www.virtualbox.org/wiki/Downloads

Настройка Vagrant

Vagrantfile, основной конфиг вагранта должен располагаться в корне проекта. 

Мой конфиг вагранта состоит из нескольких файлов:

  • Собственно сам Vagrantfile, в котором указано какую операционку будет использовать виртуалка,
  • Пара bash-скриптов, которые установят нужный софт в виртуалке, выполнят настройки БД и самого проекта, а также за произведут запуск основных команд(например для джанго это выполнение миграций, сбор статики)

Vagrantfile:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|

  config.vm.box = "ubuntu/trusty64"
  # config.vm.box_check_update = false

  #django
  config.vm.network "forwarded_port", guest: 9097, host: 9097
  #mysql
  config.vm.network "private_network", ip: "10.0.0.107"
  config.vm.network :forwarded_port, guest: 22, host: 2228, id: 'ssh'
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1200"
    vb.cpus = 2
  end
  config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"
  config.vm.provision "shell", path: "configs/vagrant-setup.sh"
end

configs/vagrant-setup.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env bash
sudo echo "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main" > /etc/apt/sources.list.d/pgdg.list
sudo wget --quiet https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
rm ACCC4CF8.asc
sudo apt-get update
sudo apt-get upgrade -y

sudo su -c 'echo "Europe/Moscow" > /etc/timezone'
sudo dpkg-reconfigure -f noninteractive tzdata
sudo apt-get build-dep python-imaging
sudo apt-get install -y python-setuptools  python-pip libjpeg8 libxml2 libjpeg62-dev libxml2-dev libxslt-dev python-dev libfreetype6  libmysqlclient-dev libfreetype6-dev python-dev build-essential htop mc
sudo apt-get install -y postgresql-9.4 libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-dev python-dev build-essential postgresql-server-dev-9.4 htop
sudo pip install -r /vagrant/project/requirements.txt
pip freeze
pwd
bash /vagrant/configs/postgres_setup.sh

sudo apt-get install -y nodejs npm nodejs-legacy git
sudo npm install -g bower
bower -version

cat /vagrant/configs/.profile > /home/vagrant/.profile
source /home/vagrant/.profile
cd /vagrant/project
python manage.py migrate

configs/postgres_setup.sh

1
2
3
4
5
6
7
8
#!/usr/bin/env bash
sudo su - postgres -c "dropdb projectname"
sudo su - postgres -c "dropuser projectname"
sudo su - postgres -c "createdb projectname"
sudo su - postgres -c "createuser projectname"
sudo su - postgres -c "psql -c \"ALTER USER projectname with PASSWORD 'password';\""
sudo su - postgres -c "psql -c \"ALTER USER projectname with SUPERUSER;\""
# PGPASSWORD="password" psql -U projectname -d projectname --host=127.0.0.1 < /vagrant/pg_dump.sql

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

Для начала работы с виртуальным окружением достаточно набрать vagrant up в корне проекта (там же где лежит Vagrantfile) и вагрант установит виртуалку и запустит все конфиги. 

После этого с помощью команды vagrant ssh можно залогиниться в виртуалку и убедиться, что всё поднялось как надо.

Помните, удаление файлов из директории /vagrant в виртуальной машине удалит их и на хост машине. Поэтому rf -rf / в виртуалке писать крайне желательно.

Интеграция с PyCharm

Для чего нужна интеграция средой разработки, когда запустить всё можно в 2 команды в терминале?

PyCharm проиндексирует установленные питонячие пакеты, благодаря чему будет работать автодополнение кода и прочие фишки за которые пользователи любят эту IDE. Кроме того, интегрировавшись с Vagrant, PyCharm научится запускать и дебажить проект на Python-интерпретаторе вагрантной виртуалки.

Для начала в настройках PyCharm нужно указать где лежит исполняемый файл vagrant. В настройках в разделе Tools | Vagrant в поле Vagrant executable указываем путь. В случае с Mac OS X путь будет '/opt/vagrant/bin/vagrant'.

Далее необходимо указать PyCharm Python-интерпретатор в вагрантовской виртуалке.

Для этого в настройках, в Project | Project Interpretuer справа от выпадающего списка с доступными интерпретаторами нажимаем на кнопку и выбираем Add remote.

В окне Configure Remote Python Interpreter выбираем Vagrant, ждем, если нет ошибок, то нажимаем OK.

В окне с настройками жмем Apply & OK и ждем пока PyCharm проиндексирует установленные питонячие пакеты.

Из необязательного, но полезного остается создать Run Configuration.

Моя конфигурация выглядит так:

Здесь я хочу обратить внимание на важность указания корректного IP и порта. Порт нужно указать такой, который для этого заготовлен в Vagrantfile, а IP нужен, чтобы можно было открывать браузер по клику из консоли запущенной конфигурации:

Надеюсь, что этим сэкономил вам порядочное количество времени!

 

Опубликовано: 5 января 2016 г.

Sparse is better than dense.

PEP20: The Zen of Python