Большинство русских статей по (Opscode Chef), которые мне попадались, содержали выдержки из кукбука (cookbook) и рассказ «какая классная штука Шеф». И все. Мол, смотри как я могу! А что и как с ним делать — не понятно. На официальном сайте есть подробная вики. Но в ней, ИМХО, легко заблудиться. Простого руководства «как сделать элементарное чтобы работало» нашел только в виде видео, по мотивам которого родилась эта статья.
Часть первая. Идеологическая. Зачем.
Если у вас 5 серверов, сетапить их нужно крайне редко, то и пары рук хватит. Можно еще положить /etc в Git или SVN, обязательно делать регулярные бекапы и жить спокойно. Для автоматизации деплоев приложения подойдет то, чем лучше всего владеет админ, даже если это простой скрипт на bash/python/ruby, или capistrano/fabric/etc.
Если машин больше десятка, к тому же похожих или одинаковых, то скриптами обходиться уже сложновато. Capistrano/fabric — дают некоторые удобства, параллельный запуск на нескольких серверах, но логику все же писать приходится самому. С ними удобно деплоить, особенно приложение на том же языке, но не конфигурировать или сетапить. Тут уже нужно либо свои «костыли» городить, либо, что проще, взять уже готовый.
От Шефа я отпирался до последнего, пока не столкнулся со следующим. Пускай имеем n одинаковых серверов, а /etc у всех в одной ветке репозитория. Поменяли конфиг nginx. Нужно применить изменения на всех остальных машинах. Как? Например, взять dsh:
dsh -r ssh -c -M -m node1 -m node2 -m nodeN -- 'cd /etc && sudo git pull'
Сюда же, в принципе, можно дописать и "/etc/init.d/nginx reload" и обновлять все, везде и сразу. Но для продакшина это не годится. Да и локальным пользователям перебои не очень приятны. Ко всему прочему, там еще есть supervisor, postgres, mongodb и много других сервисов, с которыми та же история. Как минимум, придется сделать по скриптику для перезагрузки каждого. В общем, «костыли» получаются.
А Шеф как раз для такого предназначен. Изменил конфиг, он рассеялся по всей ферме, нужные (и только нужные) сервисы перегрузились. Плюс абстракция от версии *nix, да и MS, вроде как, поддерживается. Для конфигов есть шаблоны, которые «собираются» в зависимости от параметров сервера. В общем, вкусного много. Кстати, на текущем проекте используются все сразу: пара скриптов на bash, fabric и Chef.
Ближе к практике. Давайте с нуля напишем и задеплоим простой кукбук по установке nginx, заодно разберемся. Для начала понадобится тестовая машина с sudo. Инструкция рассчитана на Ubuntu 11.10, но должна подойти под любой *nix.
2. Установка и конфигурирование
Шеф написан на Ruby. А Ruby удобней ставить через Ruby Version Manager (RVM).
На своей машине, из-под обычного пользователя:
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
Далее перелогиниваемся, или открываем новый терминал (чтобы перезагрузился bash profile).
rvm install 1.9.2
rvm use 1.9.2 --default
RVM ставит и себя, и руби в ~/.rvm если запускать не из-под root`a. Cистема не пачкается, да и удалить легко, если что.
Ставим Chef solo. Можно и из пакетов ставить, но rubygems — более «родной», не зависящий от пакетного менеджера способ.
gem install knife-solo
Есть 3 конфигурации Chef:
- Solo — дает возможность запускать кукбуки.
- Server — центарилизированное хранилище кукбуков, данных о серверах, поиск по ним, веб-интерфейс.
- Client — зупускается на управляемой машине.
Конфигурируем:
cd ~
knife configure -r . --defaults
3. Кухня, повареная книга и нож
knife kitchen solodemo
Создастся папка solodemo:
cd solodemo
tree
.
|-- cookbooks - кукбуки. Подробнее ниже.
|-- data_bags - хранилище данных глобальных данных (например, пользователи, параметры конфигураций, различные общие настройки).
|-- nodes - информация о серверах (нодах).
|-- roles - роли. Фактически это группы кукбуков и параметров к ним. Например, Apache сервер, MySQL сервер.
|-- site-cookbooks
`-- solo.rb
Это т.н. «кухня». Фактически, некое упрощенное подобие Chef Server, только на локальной файловой системе.
Создадим кукбук для установки nginx.
cd solodemo
knife cookbook create nginx -o cookbooks
Это тоже папка. Смотрим.
cd cookbooks
tree
.
|-- attributes
|-- definitions
|-- files
| `-- default
|-- libraries
|-- metadata.rb
|-- providers
|-- README.md
|-- recipes - рецепты "что сделать". default.rb выполняется по умолчанию, если не указать другой. По
одному рецепту в файле.
| `-- default.rb
|-- resources
`-- templates - шаблоны в формате ERB.
`-- default
Recipe (рецепт) — скрипт, описывающий что должно быть выполнено. Поддерживается как Ruby, так и вставки на Bash, Perl, Python, csh.
Ресиптов может быть несколько, но «default» выполняется, если не указать какой-то конкретно (при вызове кукбука).
В recipes/default.rb добавляем
package "nginx"
Сохраняем.
«Package» тут — это ресурс. Посмотреть список с описанием встроенных ресурсов можно на вики. Их можно дополнять и расширять прямо в кукбуках при необходимости. Язык, на которых пишутся ресипты — Ruby DSL. Логика построена от обратного. Мы просто говорим, что на сервере должен быть установлен пакет «nginx». А Chef следит чтобы так и было делая что требуется. В принципе, то же самое можно описать на любом другом языке. Но тут много удобных вещей, что называется, «из коробки». Конечно, есть нюансы. Например, с пакетами, важно верно задать имя. Так, для apache нужно уже писать условие, т.к. в RPM-based дистрибутивах это httpd, в Debian — apache2.
Далее, заходим на тестовый сервер и выставляем hostname. Это важно, т.к. Chef различает ноды именно по нему.
hostname testserver.example.com
echo "testserver.example.com" > /etc/hostname
и в /etc/hosts добавляем
10.10.10.10 testserver.example.com
Проверяем:
hostname -f
Если в ответ «testserver.example.com» — все нормально. Нет — правим /etc/hosts.
Теперь, с локальной машины из папки solodemo:
knife prepare ubuntu@testserver.example.com
Придется немного подождать и, возможно, ввести пароль для sudo. «Prepare» установит chef-client, который бкдет принимать команды.
В папке nodes должен появиться файлик вида testserver.example.com.json. Пишем в него:
{ "run_list": ["recipe[nginx]"] }
То есть, нужно запустить кукбук «nginx», а точнее, рецепт «default» из него.
Потом
knife cook ubuntu@testserver.example.com
Все.
Выводы
Да, плясок вокруг одного nginx'а — много. Но на тривиальные задачи есть кукбуки, при чем достаточно гибкие и продуманные. А для нетривиальных — раз написанный кукбук позволяет установку полностью автоматизировать, и является своего рода документацией. На то чтобы разобраться и описать установку первого сервера я потратил неделю, зато установка «с нуля» занимает теперь минут 20. Часто ли такое надо? Пока нет. Но конфигурировать теперь — одно удовольствие. А если все равно писать документацию, так почему не делать это сразу на Chef? Да и заказчик может поднять и «пощупать» все на своей виртуалке с помощью пары команд.
Я решил не перегружать статью информацией. Это все-таки больше руководство. Но термины сделаны ссылками, чтобы кому интересно — легко нашел.
Ссылки
- Видео Мэтта Шеффера, за которое ему необъятная благодарность. :) Желательно смотреть сразу все эпизоды.
- Репозиоторий с официальными кукбуками. В них можно очень много почерпнуть, или использовать полностью.
- Сайт и вики по Шефу.
Автор: anafor