Статьи

Надежное распределение базовых коробок Vagrant

 Vagrant обычно используется для предоставления локальных, единообразных и повторяемых виртуальных машин разработки. Repeatable уделяется мало внимания в документации, но так как я использовал vagrant, я был удивлен тем, как часто я уничтожаю и воссоздаю свои коробки.

Почему заказные базовые коробки

Наша типичная подготовка занимает около 30 минут. Половина из этого — загрузка и установка aptзависимостей, а половина — загрузка, компиляция (тьфу) и установка pipзависимостей для Python. Что еще хуже, это не особенно надежно; компиляция библиотек Python завершится примерно 10% времени. Достаточно, чтобы быть действительно раздражающим.

База ящиков на помощь. Прилагаемые коробки Ubuntu precise32и precise64около 300Мб, и содержат только операционную систему и минимальные другие зависимости. Но вы можете создавать свои собственные файлы базового блока из ранее настроенной виртуальной машины.

Сжатие изображений

Запуск стандартной vagrant package --output /tmp/mydev.boxкоманды создает базовую коробку 2.5 ГБ в моем случае. Как мы перешли с 300 МБ до 2,5 ГБ? Это на самом деле в основном раздувать. Вы можете сэкономить немного места, запустив эту суть внутри вашей виртуальной машины, прежде чем ее упаковать.

В моем случае это урезало его до 800 МБ.

Вы хотите, чтобы ваш образ разработчика был публичным?

В нашем случае мы не хотели делать это изображение общедоступным. Хотя коробка не имеет фактический код на нем (он будет загружен позже через NFS), он делает есть ключи разработки API / пароли. Зачем? Некоторое время назад мы удалили их из репозитория github и переместили в /etcконфигурационные файлы. Кроме того, я не уверен, что мы хотим сделать что-либо в нашей конфигурации сервиса публичным.

Это проблема, потому что Vagrant предполагает, что вы box_urlбудете использовать HTTP / HTTPS. Он поддерживает базовую аутентификацию, но это вряд ли безопасно.

А как насчет Vagrant Cloud?

Vagrant запускает сервис под названием Vagrant Cloud, предназначенный именно для этого случая использования. Тем не менее, он находится в ранней бета-версии и не поддерживает хостинг файлов на данном этапе. Вам нужно загрузить свой ящик куда-то еще и дать им URL, чтобы вы вернулись на круги своя.

Плагины

Я также не смог найти бродячий плагин для своего варианта использования. Существует интересный плагин vagrant-fog-box-storage, который позволяет загружать образ коробки с S3. Тем не менее, он не работает с версиями Vagrant после 1.1. Кроме того, я почти уверен, что не хочу включать токены доступа AWS в свой Vagrantfile.

Я также очень уверен , что я не хочу писать от собственного плагина в рубин.

Vagrant на самом деле использует CURL

В процессе поиска я случайно наткнулся на бродячий код загрузки , где быстро понял, что они используют cURL для фактической загрузки. Большой! Малоизвестная особенность Curl является то , что она поддерживает множество различных протоколов: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp.

На самом деле это оказывается осознанным решением поддержать scp. Все, что вам нужно сделать, это использовать URL-адрес scp, как scp://my-server:/tmp/dev.box.

cURL не имеет этой опции по умолчанию в OSX

Одна большая проблема. Все наши машины для разработки — это Apple, и curlкоманда, встроенная в OSX Mavericks, не компилируется с опцией scp. Итак, мы переходим к домашнему пиву.

brew install curl --with-ssh
brew link curl --force

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

Пример бродячего файла

Использование scp URL в вашем Vagrantfileпростом:

# -*- mode: ruby -*-
Vagrant.configure("2") do |config|
  config.vm.hostname = "dev-vagrant"
  config.vm.box = "dev"
  config.vm.box_url = "scp://my-server:/tmp/dev.box"
end

Будущая работа

В идеале, сам Vagrant мог бы при необходимости обращаться scpнапрямую к проблеме OSX. Также было бы идеально, если бы они поддерживали S3 напрямую. На самом деле, просто давайте напишем нашу собственную команду / скрипт оболочки для загрузки файла.