Статьи

Бродяга: что, почему и как

Эта статья поможет вам разобраться с использованием Vagrant для управления экземплярами виртуальной машины и объяснит, как вы можете использовать Puppet для предоставления различных ресурсов, таких как PHP и PostgreSQL.


У разработчиков есть огромный выбор способов создания среды для веб-разработки.

У разработчиков есть огромный выбор способов создания среды для веб-разработки. Вы можете использовать «локальные» параметры, такие как установка готовых серверных стеков «все в одном», таких как Zend Server, XAMPP, MAMP, WAMP и т. Д., Или вы можете установить компоненты самостоятельно из источника или с помощью системы управления пакетами, такие как Homebrew, Apt и Yum.

Это может произойти, когда вы работаете над различными проектами: PHP 5.3 и PHP 5.4, MySQL, SQLite, MongoDB, Postgres, PEAR, PHPUnit, Rails 3.1, Memcached, Redis, Gearman, NodeJS и т. Д. Если вы обновляете компьютер или умирает компьютер , вам придется начать все сначала.

Вы можете иметь «удаленную» настройку, используя сервер в сети с общими папками Samba или SSH-сервер, смонтированный с помощью такого инструмента, как ExpanDrive . Последний вариант может привести к задержке при чтении / записи файла, что крайне раздражает. Вы можете использовать SSH + Vim для всего, что быстро, но это работает, только если вы хотите использовать Vim для всего.


Хотя вы можете быть довольны тем, как вы сейчас поступаете, многие из вас слышали (или говорили): «Ну, это работает на моем компьютере». Это ужасно распространено, и это происходит, когда окружающая среда отличается даже самой тривиальной деталью.

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

Это может показаться простым, если вы просто подумаете об установке Apache, PHP и некоторой копии MySQL, но есть миллион факторов, о которых следует подумать. Если вы разрабатываете для OSX и развертываете в системе Ubuntu, то вы заметите забавные проблемы с капитализацией файлов. Это часто встречается в CodeIgniter, когда у кого-то есть библиотека с первой строчной буквой. Он нормально загрузится на OSX, но сломается при развертывании в производство. Ваш процесс разработки мог просто потерять вам какой-то бизнес, и все из-за некоторой тривиальной разницы в ОС, о которой никто не думал, пока не стало слишком поздно.


Принуждение разработчиков к использованию одной и той же ОС приведет к проблемам.

Так в чем же решение? Заставить всех ваших разработчиков выбросить свои разные инструменты и разрабатывать на одной и той же модели ноутбука? Если все ваши разработчики получают совершенно новые Macbooks, вы можете не получить слишком много жалоб, но тогда вам придется использовать OSX Server для всего.

Вы можете использовать Linux для всего, но тогда вам придется бороться за то, какой дистрибутив использовать. Принуждение разработчиков к использованию одной и той же ОС приведет к проблемам, снижению производительности и продвижению борьбы с ботаниками.

Виртуализация — это ответ, и в этом нет ничего нового, но когда люди думают о виртуализации, они часто думают о проблемах с производительностью, и их фанаты резко крутятся, а их ноутбук отчаянно пытается запустить две операционные системы.

Это все еще может иметь место при попытке запустить Windows на компьютере с низким энергопотреблением, но в наши дни средний Mac имеет 4 ГБ ОЗУ из коробки, что более чем достаточно для запуска установки сервера Ubuntu, работающей в режиме командной строки. и все ваши обычные инструменты разработки (IDE, браузер, инструменты отладки и т. д.). Есть несколько вариантов виртуализации, но я предпочитаю VirtualBox от Oracle (это бесплатно). Это программное обеспечение выполняет всю тяжелую работу по виртуализации, а затем инструмент, называемый Vagrant, управляет экземплярами.


Сначала скачайте VirtualBox и установите его. В системах * nix (Mac OSX, Linux и т. Д.) Вам необходимо изменить ваш .bash_profile (или .zsh_profile), чтобы расширить $PATH :

1
2
PATH=$PATH:/Applications/VirtualBox.app/Contents/MacOS/
export PATH

Это позволит Vagrant узнать, где установлен VirtualBox, и, конечно, будет отличаться для разных операционных систем.


Вы можете скачать сборку vagrant для своей операционной системы или установить ее как гем, если она недоступна:

1
$ gem install vagrant

Сделайте где-нибудь для своих бродячих установок жить

1
2
mkdir -p ~/Vagrant/test
cd ~/Vagrant/test

Мы будем использовать Ubuntu 12.04 LTS (Precise Pangolin), в котором уже настроена «коробка».

1
vagrant box add precise32 http://files.vagrantup.com/precise32.box

Вы видите здесь аргумент «точный32», который является псевдонимом для URL. Теперь вы можете создать экземпляр, который будет загружать этот .box.

1
2
vagrant init precise32
vagrant up

Теперь он будет запущен. Легко! Если вы хотите попасть в этот экземпляр через SSH, используйте эту команду:

1
vagrant ssh

У вас будет файл с именем Vagrantfile , который содержит конфигурацию для этого экземпляра:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- mode: ruby -*-
# vi: set ft=ruby :
 
Vagrant::Config.run do |config|
 
    config.vm.box = «precise32»
    config.vm.box_url = «http://files.vagrantup.com/precise32.box»
 
    # Assign this VM to a host-only network IP, allowing you to access it
    # via the IP.
    # any other machines on the same network, but cannot be accessed (through this
    # network interface) by any external networks.
    config.vm.network :hostonly, «192.168.33.10»
 
    # Set the default project share to use nfs
    config.vm.share_folder(«v-web», «/vagrant/www», «./www», :nfs => true)
    config.vm.share_folder(«v-db», «/vagrant/db», «./db», :nfs => true)
 
    # Forward a port from the guest to the host, which allows for outside
    # computers to access the VM, whereas host only networking does not.
    config.vm.forward_port 80, 8080
 
    # Set the Timezone to something useful
    config.vm.provision :shell, :inline => «echo \»Europe/London\» | sudo tee /etc/timezone && dpkg-reconfigure —frontend noninteractive tzdata»
 
    # Update the server
    config.vm.provision :shell, :inline => «apt-get update —fix-missing»
 
    # Enable Puppet
    config.vm.provision :puppet do |puppet|
        puppet.facter = { «fqdn» => «local.pyrocms», «hostname» => «www» }
        puppet.manifests_path = «puppet/manifests»
        puppet.manifest_file = «ubuntu-apache2-pgsql-php5.pp»
        puppet.module_path = «puppet/modules»
    end
 
end

Это, если вы не заметили, синтаксис Ruby; так что вы можете проявить творческий подход к этому файлу, но это основы.

Он покажет, какой псевдоним использовать, и будет иметь URL-адрес в случае, если псевдоним не настроен локально (хорошо для совместного использования).

share_folder действительно полезны для сопоставления папки в экземпляре с локальной папкой. Используя nfs => true экземпляр сможет записывать и изменять права доступа к файлам, что полезно, например, если вы пытаетесь установить CMS там.

Переадресация портов позволяет вам получить доступ к вашему экземпляру по http://localhost:8080 и, конечно, изменить его на другой порт, если это конфликтует.

Этот файл конфигурации также установит часовой пояс Европа / Лондон, а затем запустит apt-get update , которое должно заставить вашу систему apt-get update всякий раз, когда она загружается. Если вы пропустите этот элемент конфигурации, вы можете обнаружить, что несколько пакетов отказываются устанавливать, поскольку ссылки уже устарели.

Когда вы измените конфигурацию, вы можете перезагрузить экземпляр, чтобы использовать его:

1
vagrant reload

Теперь, когда наши серверы работают и готовы к работе, нам нужно установить некоторое программное обеспечение. Мы не просто собираемся apt-get install пакет из командной строки, мы собираемся «подготовить» наши серверы.


Многим разработчикам не нужно задумываться о подготовке серверов.

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

То, как сисадмины справляются с этим, варьируется, но в прошлом использовались всевозможные решения — от поддержки работы вики-команд (которые могут быстро стать большими и устаревшими) и удивительного подхода с «мульти-терминалом», когда вы печатаете Команды в одном окне, и он дублирует те же команды на других 7 серверах одновременно. Эти методы все ужасны.

Одним из решений может быть создание собственного файла .box или создание резервных копий .iso чтобы новые серверы могли просто основываться на этом, но поддержание этих образов создает много дополнительной работы, и как бы вы ни старались, эти машины разработки стать несинхронным с течением времени.

На данный момент существует две популярные системы, называемые Puppet и Chef .

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

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

«Установите Apache»

С Puppet мы бы сказали:

«Убедитесь, что Apache установлен»

Или вместо:

«Создайте новую папку с именем /var/www и установите права доступа к www-data: www-data»

С Puppet мы бы сказали:

«Убедитесь, что /var/www существует и имеет разрешения, соответствующие www-data: www-data»

Разница здесь в том, что эти манифесты можно запускать несколько раз (для задания cron каждый час или ежедневно), чтобы поддерживать актуальность, и не будет неожиданных результатов от того, что что-то пытается установить дважды.

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

Сначала манифесты немного сбивают с толку, но через некоторое время они начинают обретать смысл.

Чтобы просмотреть базовый пример:

1
2
3
4
5
6
file {‘testfile’:
  path => ‘/tmp/testfile’,
  ensure => present,
  mode => 0640,
  content => «I’m a test file.»,
}

Не нужно объяснять, что здесь происходит, верно?

Этот файл впоследствии может быть назван в вашем манифесте как «testfile», что означает, что он может быть указан как зависимость для других действий.

Для дальнейших примеров мы будем ссылаться на манифесты PyroCMS Puppet на GitHub .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
include apache
 
$docroot = ‘/vagrant/www/pyrocms/’
$db_location = «/vagrant/db/pyrocms.sqlite»
 
# Apache setup
class {‘apache::php’: }
 
apache::vhost { ‘local.pyrocms’:
    priority => ’20’,
    port => ’80’,
    docroot => $docroot,
    configure_firewall => false,
}
 
a2mod { ‘rewrite’: ensure => present;

Это включает в себя модуль «apache», устанавливает некоторые переменные, запускает дополнительный манифест «apache :: php» в модуле apache, устанавливает виртуальный хост, а затем обеспечивает включение «mod_rewrite».

Все эти классы определены в модуле Apache, который мы включили.

Двигаясь дальше, мы также хотим установить PHP:

1
2
3
4
5
6
7
8
9
include php
 
php::module { [‘xdebug’, ‘pgsql’, ‘curl’, ‘gd’] :
    notify => [ Service[‘httpd’], ],
}
php::conf { [ ‘pdo’, ‘pdo_pgsql’]:
    require => Package[‘php5-pgsql’],
    notify => Service[‘httpd’],
}

Этот фрагмент манифеста установит необходимые нам PHP-расширения, а затем опция notify сообщит Apache, что вы установили новую конфигурацию, то есть она перезапустится.

1
2
3
4
5
6
7
8
include postgresql
 
class {‘postgresql::server’: }
 
postgresql::db { ‘pyrocms’:
    owner => ‘pyrocms’,
    password => ‘password’,
}

Это создаст сервер postgres, создаст базу данных, называемую «пирокм», и убедится, что пользователь с именем «пирокм» существует с предоставленным паролем.

Почти закончен! Последний шаг — убедиться, что у вас есть файлы и папки, доступные для записи:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
file { $docroot:
    ensure => ‘directory’,
}
 
file { «${docroot}system/cms/config/config.php»:
    ensure => «present»,
    mode => «0666»,
    require => File[$docroot],
}
 
$writeable_dirs = [«${docroot}system/cms/cache/», «${docroot}system/cms/config/», «${docroot}addons/», «${docroot}assets/cache/», «${docroot}uploads/»]
 
file { $writeable_dirs:
    ensure => «directory»,
    mode => ‘0777’,
    require => File[$docroot],
}

Это обеспечит наличие корневого каталога документов Apache, файла конфигурации 0666 и нескольких папок с возможностью записи 777.

Там у нас это есть!

Чтобы запустить все это, просто перезагрузите ваш vagrant экземпляр или запустите:

1
vagrant provision

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

Здесь используются следующие модули: Apache , Postgres , PHP, и вы можете увидеть все это в действии, клонировав репозиторий PyroCMS Vagrant:

1
2
3
git clone —recursive git://github.com/pyrocms/devops-vagrant.git ~/vagrant/pyrocms
cd ~/vagrant/pyrocms
vagrant up

Укажите в браузере http://localhost:8089/ и вы должны увидеть установщик. Легко, а?

Примечание: Это будет установлено с MySQL, так как поддержка Postgres и SQLite в PyroCMS все еще находится в стадии разработки, ожидая завершения некоторых функций CodeIgniter PDO. Если вам интересно, вы можете поэкспериментировать, изменив Vagrantfile, чтобы использовать манифест ubuntu-apache2-pgsql-php5.pp , уничтожить экземпляр и снова запустить его. Подмодуль pyrocms также должен быть извлечен для / pdo


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

Мы также создали контрольный список требований и в будущем сможем создать любое количество идентичных серверов за считанные минуты, а не часы!