Статьи

Создание виртуального сервера с помощью Vagrant: практическое руководство

Vagrant — инструмент для создания виртуальных машин (в формате VirtualBox), который соответствует спецификации. Он написан на Ruby, но в нем нет никаких предположений относительно среды, которую вы собираетесь создать; В этой статье мы настроим виртуальный сервер для приложений PHP, работающих внутри Apache.

Цели

Vagrant — это более быстрый способ создания воспроизводимых машин: вы можете хранить метаданные о пакетах, которые вы хотите установить, в Linux-боксе, а затем воссоздавать новый экземпляр виртуальной машины в любое время.

Это легкая альтернатива хранению одного файла изображения для каждой конфигурации; Более того, файлы изображений для Vagrantfile — это то же самое, что двоичные файлы для исходного кода . Гораздо проще изменить краткий список пакетов, которые загружают виртуальную машину и начинают удалять файлы и выполнять множество команд apt-get.

Созданные вами машины будут доступны любому в вашей команде, поэтому они смогут воспроизвести ошибку, как если бы они были в производстве. Согласованность распространяется по нескольким параметрам: ОС, версии установленного программного обеспечения и библиотек, а также файлы конфигурации в / etc и других местах.

Машины, произведенные Vagrant, основаны на Virtualbox , решении с открытым исходным кодом, которое сначала преследовало Sun, а теперь Oracle после его приобретения.

Драгоценные камни?

Vagrant написан на Ruby и распространяется как гем (механизм, аналогичный PEAR для пакетов PHP). В Ubuntu установите пакет rubygems, чтобы получить доступ к команде gem . В Ubuntu Oneiric у gem есть некоторые проблемы: исправьте его конфигурацию, чтобы Vagrant можно было установить с:

[giorgio@Desmond:~]$ sudo gem install vagrant

Теперь для первой ВМ

Следуя руководству по началу работы, мы можем получить Ubuntu Lucid, чтобы не начинать с нуля:

[giorgio@Desmond:~]$ vagrant box add lucid32 http://dl.dropbox.com/u/7490647/talifun-ubuntu-11.04-server-i386.box

Эта команда загрузит файл коробки размером 372 МБ, но это лучше, чем загрузка .iso и его установка на новую виртуальную машину. Ящики являются глобальными, поэтому они будут храниться в ~ / .vagrant.d / box, и вы сможете повторно использовать их при создании множества разных машин. Они являются лишь отправной точкой, содержащей не только файлы, но и конфигурацию оперативной памяти, места на диске и так далее.

Создайте папку для нашей конфигурации:

[giorgio@Desmond:~]$ mkdir john && cd john

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

Создайте Vagrantfile, который является эквивалентом make-файла для виртуальных машин:

[giorgio@Desmond:~]$ vagrant init lucid32

Теперь вы увидите текстовый файл Vagrantfile внутри папки:

Vagrant::Config.run do |config|
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "lucid32"
  # (everything else is commented)
  # ...
end

vagrant up запустит машину, которая пока ничего не делает. vagrant destroy удалит компьютер, но он будет воссоздан из конфигурации по вашему желанию.

Программное обеспечение

Однако сначала нам нужно настроить некоторые пакеты. Мы будем использовать простой манифест Puppet, чтобы указать пакеты для Apache и PHP, но ничего особенного (я еще даже не эксперт в Puppet).

[giorgio@Desmond:~/john]$ mkdir manifests
[giorgio@Desmond:~/john]$ touch manifests/lucid32.pp

Мы можем указать, какие пакеты устанавливать в lucid32.pp:

class lucid32 {
  exec { "apt_update":
    command => "apt-get update",
    path    => "/usr/bin"
  }

  package { "php5":
    ensure => present,
  }

  package { "libapache2-mod-php5":
    ensure => present,
  }

  package { "apache2":
    ensure => present,
  }

  service { "apache2":
    ensure => running,
    require => Package["apache2"],
  }
}

include lucid32

Давайте изменим Vagrantfile, чтобы включить его:

Vagrant::Config.run do |config|
  # Enable the Puppet provisioner, which will look in manifests/
  config.vm.provision :puppet

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "lucid32"
end

Перенаправление порта

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

  # Forward guest port 80 to host port 4567 and name the mapping "web"
  config.vm.forward_port("web", 80, 4567)

vagrant up создаст машину сейчас. Если что-то пойдет не так, выполните vagrant destroy , измените свою конфигурацию и попробуйте снова с vagrant up.

Выполнение файлов PHP

Откуда мы знаем, что машина работает? Давайте создадим файл phpinfo.php в папке машины:

<?php
phpinfo();

У нас есть доступ SSH как пользователь ‘vagrant’, просто выполнив vagrant ssh. Существует также общая папка между хостом и гостевыми машинами, которая является папкой, в которой мы сейчас находимся.

На виртуальных машинах эта папка монтируется в / vagrant. Таким образом, мы можем скопировать файл PHP через SSH, чтобы протестировать нашу машину:

[giorgio@Desmond:~/john]$ vagrant ssh
vagrant@lucid32:~$ sudo cp /vagrant/phpinfo.php /var/www/

Нам также нужно перезапустить Apache, так как после установки я не нашел удобного способа автоматически перезапустить его, чтобы он интерпретировал PHP-файлы:

vagrant@lucid32:~$ sudo /etc/init.d/apache2 restart

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

Теперь загрузите http: // localhost: 4567 / phpinfo.php:

Завершение исполнения

vagrant halt выключит машину, а vagrant destroy также выбросит все (файл образа, но не конфигурацию). Приостановка и возобновление могут быть выполнены с помощью vagrant suspend и vagrant resume , но содержимое оперативной памяти будет занимать место на вашем диске, поскольку его необходимо хранить.