Статьи

Дайте Вагранту место в вашем рабочем процессе

logo_vagrant-81478652 Недавно я активно участвовал в разработке. На самом деле для меня это немного приятное удовольствие. В наши дни почти ожидаемо, что мы разработчики знаем что-то о правильной настройке блоков для наших приложений. Это имеет смысл, мы потратили много времени на то, чтобы создать локальную среду именно так, как мы этого хотим. Если мы решим, что хотим использовать Redis в наших приложениях, мы установим его, немного узнаем об этом и вернемся к продуктивности.

Я ни в коем случае не парень типа «сисадмин», и мне пришлось погуглить, что такое бородатая шея. Но я люблю дурачиться с виртуальными машинами, экземплярами EC2 и тому подобным. В прошлом я всегда склонялся к приготовлению пищи с шеф-поваром . По моему личному мнению, разработчик должен понимать инфраструктуру, в которой будет жить их приложение. Возможно, он не идеален, вероятно, может быть связан с оптимизацией и большей безопасностью на вершине, но этого должно быть достаточно, чтобы приложение вырвало свой первый набег в дикую природу. Затем, если это выглядит успешно, наймите кого-нибудь, кто знает, что они делают, чтобы укрепить эту инфраструктуру.

Я уже писал об использовании шеф-повара для этой цели. Я использовал chef solo для предоставления виртуальной машины. Это все хорошо, но, честно говоря, это не идеально. Тестирование сценариев шеф-повара обременительно, вам нужно сделать снимок, проверить, сдуть, вспенить, промыть, повторить. Это очень сложно. Затем, скажем, вам нужно поделиться окружением с членом вашей команды. Им нужно пройти некоторую степень настройки, узнать, что делает шеф-повар, и они становятся продуктивными. Если бы только был способ сделать всю эту настройку тривиальной. Если вы читали это далеко, вы уже знаете, что я говорю о Vagrant .

Основы

Вот вам экскурсия, если вы раньше не использовали Vagrant. В основном он работает поверх VirtualBox . Это зависимость, поэтому, если она не установлена, установите ее. Затем загрузите и установите Vagrant для своей системы. В настоящее время я использую Ubuntu 12.10, и после запуска установочного пакета deb я добавил /opt/vagrant/bin в мою PATH. (Я также использую zsh, поэтому я добавил строку PATH=/opt/vagrant/bin:$PATH в мой файл ~/.zshrc ).

После того, как он будет установлен, вы сможете запустить vagrant -h и получить список команд, которые нужно запустить для vagrant.

Вагрант имеет понятие «Коробки». Лучше всего рассматривать эти блоки как базовую конфигурацию для среды, которую вы хотите настроить. Примером базового блока может быть 64-битный сервер Debian с установленным Apache, настроенный для виртуального хостинга.

Комплексное хранилище готовых коробок предоставляется на vagrantbox.es . Мы займемся созданием нашей собственной коробки позже, а пока давайте выберем что-то удобное. Вы добавляете поле с командой:

 vagrant box add precise64 http://files.vagrantup.com/precise64.box 

Загрузка занимает некоторое время, но вы должны делать такие вещи только один раз. Как только он загрузит и добавит коробку, вы можете создать столько проектов на основе этой базовой конфигурации (которую мы назвали «точным 64»), сколько пожелаете.

Создайте каталог vagrant_test и выполните vagrant init precise64 . Это создаст Vagrantfile . Файл Vagrantfile содержит тонны комментариев, каждый из которых, если вы новичок в vagrant, будет несколько чужим. Это похоже на файл Rails routes.rb при создании нового приложения: вы можете использовать только некоторые из них, но это будет хорошей ссылкой в ​​дальнейшем.

Теперь мы готовы запустить нашу первую среду. Запустите vagrant up , пусть он загружает виртуальную машину без головы (то есть вы не увидите графический интерфейс Virtual Box). Как только он завершится, запустите vagrant ssh и, Presto, вы окажетесь в оболочке нашей только что созданной виртуальной среды. На этом этапе вы можете exit из сеанса SSH. Если вы сейчас vagrant status , вы увидите, что виртуальная машина работает. Чтобы остановить виртуальную машину, введите vagrant halt . Команда halt корректно выключает виртуальную машину и снова показывает, что она выключена.

Что-то работает

До этого момента все, что мы делали, это раскручивали новую виртуальную машину, что довольно бессмысленно. Конечно, нам нужен код там. Если вы использовали Virtual Box, в прошлом вы знали, что можете обмениваться папками между гостевой и хост-средами. В этом случае мы хотим, чтобы наш код приложения был общедоступным.

В Vagrantfile ищите строку config.vm.share_folder "v-data", "/vagrant_data", "../data" . Как говорит предыдущий комментарий, конфигурация share_folder принимает 3 параметра: имя или идентификатор, местоположение на виртуальной машине, в которой будет находиться общая папка, и местоположение на хост-ОС.

Я намерен отправить файл Vagrant вместе с моим приложением, и, используя несколько лет EngineYard, я обычно обращаюсь к общей папке, смонтированной в местоположении /data :

 config.vm.share_folder "v-data", "/data", "./" 

Используя приведенную выше конфигурацию, после загрузки ( vagrant up ) и ssh в виртуальную машину переход к каталогу /data покажет, что текущий каталог является общим. Идите вперед, добавьте / измените файлы, и вы увидите, как это отражается на виртуальной машине. Довольно аккуратные вещи, я думаю, вы согласитесь.

К настоящему времени вы должны начать видеть преимущества использования чего-то вроде Vagrant. Теперь я могу создать воспроизводимую среду, используя не более чем текстовый файл, включенный в репозиторий моего приложения. Больше не «работает на моей машине», больше не тянет за волосы. Просматривая проекты с открытым исходным кодом на Github, в эти дни вы иногда найдете странный Vagrantfile на верхнем уровне проекта, я думаю, что это потрясающая практика.

Предоставление наших услуг

У нас есть наша базовая виртуальная машина и кодовая база, но она все еще довольно ванильная. В какой-то момент мы захотим настроить нашу среду, добавив новые пакеты, такие как MySQL или менеджер версий ruby, такой как rbenv .

Вагрант, на мой взгляд, действительно прибил этот. Если вы являетесь поклонником Chef , Puppet die hard или простым пуристом, вы можете предоставлять услуги с Vagrant. Я кратко расскажу о том, как сделать это с шеф-поваром Соло, так как это мой инструмент выбора.

В файле vagrant мы можем настроить, где живут наши кулинарные книги (шеф-повар использует кулинарные книги ...) live. By default, Vagrant will look for a directory ...) live. By default, Vagrant will look for a directory поваренных книг на верхнем уровне текущего каталога, но он будет относительный путь. На этом этапе стоит создать несколько кулинарных книг.

Я создаю проект кулинарных книг и подмодуля кулинарных книг, которые мне нужны, из репозитория Opscode . Затем я настраиваю работу шеф-повара следующим образом:

 config.vm.provision :chef_solo do |chef| chef.cookbooks_path = "../cookbooks" chef.add_recipe 'apt' chef.add_recipe 'build-essential' chef.add_recipe 'mysql::client' chef.add_recipe 'mysql::server' chef.json = { "mysql" => { "server_debian_password" => "secret", "server_root_password" => "secret", "server_repl_password" => "secret" } } end 

Это очень просто, даже если вы не знакомы с шеф-поваром. Все, что я сделал здесь, — это укажите, где живут мои кулинарные книги, добавьте пару основных рецептов (apt и build-essential). Я также добавил клиент MySQL и сервер к запуску шеф-повара, указав некоторые атрибуты, которые я хочу (пароли для root). Если вы посмотрите на кулинарную книгу mysql, это объясняется в README.

Теперь с нашей существующей vagrant VM мы можем запустить vagrant reload если она работает или vagrant up и наша VM готова с установленным MySQL и готова к работе.

Небольшое предостережение при использовании Chef с vagrant так же, как и в случае с самим Chef, вы можете передать URL-адрес тарболу следующим образом:

 config.vm.provision :chef_solo do |chef| chef.recipe_url = "http://github.com.com/company_name/cookbooks/archive/v0.1.0.tar.gz" end 

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

Вернуться к Base-ics

Теперь приходит настоящая причина, по которой я люблю работать с Vagrant. Вы помните, как в начале статьи мы использовали готовую коробку из vagrantbox.es . Что ж, мы только что завершили базовую установку всего, что может понадобиться для проекта, или, может быть, просто базовую установку для приложений Rails в целом? Что ж, мы можем создать «коробку» для этой виртуальной машины, чтобы взять ее с собой в наш следующий проект или передать другу.

Чтобы создать пакет, используйте команду vagrant vagrant package . Простое выполнение этого в проекте упакует виртуальную машину для легкого распространения. Мне нравится правильно называть файл коробки, поэтому запустите vagrant package --output base_rails.box

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

 config.vm.box = "base_rails" # or if it is available for download # config.vm.box_url = "http://domain/for/base_rails.box 

Команда package также может принимать опцию --vagrantfile . Не путайте Vagrantfile с Vagrantfile мы работали на протяжении всей статьи. Вместо этого это Vagrantfile.pkg который указывает конфигурацию только для пакета, который вы хотите собрать.

Например, если мы хотим включить функциональность общей папки, мы создадим Vagrantfile.pkg , добавим следующее и запустим команду vagrant package .

 Vagrant::Config.run do |config| config.vm.share_folder "v-data", "/data", "./" end 

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

Теперь любой, у кого есть доступ к файлу ящика, может просто инициализировать и забрать ящик. ( vagrant init base_rails и vagrant init base_rails vagrant up ).

Завершение

Я надеюсь, что эта статья вас очень взволновала по поводу Vagrant. Я начал использовать его как способ предоставления тестовых серверов для моих запусков Chef. Я действительно видел потенциал для совместного использования сред разработки, что, как мне кажется, и есть реальная причина, по которой Vagrant существует в первую очередь.

Это действительно не заканчивается там все же. В недавнем выпуске блога HashiCorp рассказывалось о том, как Vagrant используется с AWS. Лично я не могу дождаться, когда это достигнет состояния выпуска, чтобы я мог надеть свои перчатки. Возможность создавать среды вне моей собственной машины разработки — огромная победа. Мы больше не беспокоимся об обеспечении соответствия между средами, вместо этого мы можем использовать vagrant для тестирования наших приложений, где они когда-нибудь будут жить.

Предоставление таких услуг — настоящий швейцарский армейский нож для разработчика. Мы получаем «лучшую практику» от кураторов поваренных книг, которые мы используем для шеф-повара, и приятного рабочего процесса с Vagrant. На это стоит обратить внимание, и я могу говорить только за себя, я использую провизию, а шеф-повар бежит только до меня. Это dev-ops. У меня достаточно знаний, чтобы быть опасным, когда дело доходит до предоставления серверов для личных приложений. У меня нет нужды или желания заниматься дальнейшей настройкой своих ящиков. Все, что достойно производства, я рекомендую получить совет специалиста от системного администратора.

Но, тем не менее, Вагрант сделал это безумно веселым. И будет веселее, только когда интеграция AWS-VM-Ware будет выпущена по лицензии MIT в следующем месяце или около того.