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 напрямую. На самом деле, просто давайте напишем нашу собственную команду / скрипт оболочки для загрузки файла.