6. alex@workstation:~$ ssh root@newserver
Linux EVBYMINSD234A 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Jun 17 14:39:08 2014 from workstation
root@newserver:~# apt-get install nginx-light php5-fpm php5-curl mysql-server
sudo
Reading package lists... Done
Building dependency tree
Reading state information... Done
sudo is already the newest version.
The following extra packages will be installed:
libaio1 libdbd-mysql-perl libdbi-perl libhtml-template-perl
libmysqlclient18 libnet-daemon-perl libonig2 libplrpc-perl libqdbm14 mysql-
client-5.5 mysql-common mysql-server-5.5 mysql-server-core-5.5 nginx-common
php5-common
The following NEW packages will be installed:
libaio1 libdbd-mysql-perl libdbi-perl libhtml-template-perl
libmysqlclient18 libnet-daemon-perl libonig2 libplrpc-perl libqdbm14 mysql-
client-5.5 mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5
nginx-common
nginx-light php5-common php5-curl php5-fpm
0 upgraded, 19 newly installed, 0 to remove and 0 not upgraded.
Need to get 13.7 MB of archives.
After this operation, 108 MB of additional disk space will be used.
28. А можно так прямо у меня?
Конечно! Можно поднять виртуалку.
А если в команде больше одного
человека?
А если нужно проверить всё под новой
версией ОС?
29. Vagrant
$ vagrant up
Box — это готовая, минимально
конфигурируемая виртуалка. Свой box
сделать тоже несложно!
30. Немного магии
config.vm.provision "ansible" do |ansible|
ansible.playbook = "ansible/dev.yml"
ansible.groups = {
"dev" => ["default"],
}
end
$ ansible-playbook -i qa env.yml$ vagrant provision
31. Итого
У каждого разработчика свое окружение
Управляется двумя командами:
$ vagrant up
$ vagrant provision
QA, staging, production etc — под тем же
провиженингом
35. Спасибо
Майклу Дехану за ansible
Митчеллу Хашимото за Vagrant
Вам за внимание :-)
kamazee
alex@kurilo.me
Editor's Notes
Типичные варианты работы с окружением:
1) веб-сервер на локальной машине и куча проектов на нем;
2) удаленный dev-сервер, настроенный одним человеком.
И это печально.
Подчинить — значит контролировать окружение. Ну и, по возможности, самому диктовать правила, а не полагаться на него.
Если у вас есть ответ на перечисленные вопросы, то … →
Если нет — я расскажу историю одного проекта. Грустноватую.
Жил был проект.
На нем работало около четырех разработчиков.
Все работали на одном сервере, заботливо настроенном первым тимлидом.
Сервер этот располагался в корпоративном облаке, папка с проектом монтировалась по sshfs или самбе → медленные операции IO, сетевые задержки (датацентр).
Задержки обычно до 1 мс, жить, в принципе, можно. Едем дальше.
Жил-был сервер.
На том же самом сервере крутилось приложение для QA.
И вот, как-то раз, как ни странно, понадобилось вывести приложение за пределы ограниченного круга разработчиков-тестировщиков.
Конечно, можно было просто создать еще один виртуальный хост, настроить еще одну базу данных, еще один сет индексов и источников данных для sphinx, бла-бла-бла.
Однако это не особо-то решало проблему, потому что всем понятно, что разумеется, когда-то нужен будет и совершенно отдельный сервер.
Сделовательно, с этим нужно было покончить. Окей, поехали.
Ветеран devops’а ехидно ухмыльнется, откроет терминал и уверит в том, что новый сервер поднимет за пару часов от силы.
Поставить пакеты, запилить конфиги — как-то так, в обшем.
Ну, и через пару часов бодро отрапортует о том, что мол, окружение готово. Заливайтесь, мол, и пользуйтесь на здоровье.
Залились.
Открываем главную страницу.
На ней пустота. И только где-то сверху, черным по белому (Fatal Error)
Подумаешь, LDAP-расширения нету!
Еще разок.
Что-то как-то легче не стало.
Сколько еще левых расширений использует этот код?
Сколько там еще подводных камней?
Никто не знает.
Что с этим сделать?
Ну, например, инструкцию написать.
Это решает проблему только отчасти: всё-таки выполнение инструкции и добавление в нее шагов кроме памяти и совести разработчика никто не форсирует.
Плохо!
Написать скрипт?
В общем, те, кто хоть раз пытался более-менее качественно автоматизировать установку проектного окружения шелл-скриптом наверняка поймут выражения фасада животного на слайде.
Куча времени и тонны неподдерживаемого кода.
Почти всё уже сделано до нас. Очень много кода, который управляет установкой и конфигурацией софта уже написано.
Да-да, то, что нужно.
Всё это — системы провиженинга.
Описание состояния сервера
Провиженеры могут требовать агента на управляемом сервере.
Пара слов об Ansible без читки мануалов:
1. Не требует от сервера почти ничего, кроме ssh (разве что Python, который и так там, скорее всего, есть вместе с системой) и нескольких питоновский модулей, который в большинстве случаев просто поставить сам.
2. Всё примерно так, как вы себе представляете. Он сам ходит на сервер, ставит пакеты и пишет конфиги.
3. Немного подробнее о применяемых там терминах.
Playbook — собственно, описание окружения. Последовательность задач, которую нужно выполнить на серверах, чтобы там было всё, что нужно приложению.
Роль — объединение задач, переменных для исполнения и handler’ов (хуков) для какой-то конкретной цели.
Например, заставить сервер использовать определенное зеркало, добавить сторонний репозиторий или установит веб-сервер.
Перечень серверов, которые входят в окружение для одного экземпляра приложения (возможно со значениями переменных для этого конкретного хоста)
Всё вместе — ansible выполняет таски и отчитывается.
Когда-то года два с половиной назад на Хабре появилась статья — 5 основных антипаттернов системного администрирования.
Там было четко и недвусмысленно сказано: настройка сервера по ssh руками — антипаттерн. Тогда я косо посмотрел на нее и прошел мимо.
http://habrahabr.ru/post/136323/
А сейчас вот прихожу ровно к тому же: делать этого не стóит, потому что изменения эти локальны. Конфиги провиженинга же при правильном подходе сразу прорастут на всех окружениях, где это будет нужно.
В целом, использование системы провиженинга и хранение рецептов провиженера вместе с проектом дает следующие преимущества
С серверами разобрались.
Что делать разработчикам?