Введение
Автоматизированное управление конфигурацией ваших компьютеров — необходимо для любой компании с большим парком компьютеров.
Сейчас среди администраторов очень популярен Puppet, но, по моему мнению, продукты с самописным DSL (предметно-ориентированным языком программирования) — ограниченны по своей природе.
Chef использует DSL, основанный на Ruby, что придаёт ему изящество и неограниченную расширяемость.
Update: spanasik поправил меня, Puppet также имеет в дополнение к внешнему DSL ещё и внутренний DSL, основанный на Ruby.
Архитектура
Это приложение состоит из серверной (chef server) и клиентской (chef-client) части. Кроме того, есть клиент, работающий без поддержки со стороны сервера (chef-solo). Сервер отвечает за сбор и предоставление информации об узлах (компьютерах, работающих под управлением Chef), и требуемых действиях.
С точки зрения администратора, мы просто добавляем новые узлы в Chef (выполнив стандартный скрипт на новом узле), и с помощью перетаскивания нужных ролей и рецептов настраиваем узел. Остальное в стандартном сценарии происходит автоматически и без вашего участия.
Узлы
Компьютеры, зарегистрированные в Chef, называются узлами. Мы всегда можем просмотреть и изменить список примененных рецептов,
узнать различные характеристики узла (ip, fqdn, количество процессоров, множество иных параметров, ваши атрибуты), как добавленные вами, так и собранные самим chef (с помощью ohai).
Для авторов рецептов очень важно то, что мы всегда можем в коде рецепта найти те узлы, которые нам нужны, по его атрибутам, и также использовать эти атрибуты, как нам удобнее.
Например,
template "/etc/my-software.conf" do
source "my-software.conf.erb"
variables :trackers => search(:node, "recipe:tracker")
notifies :restart, resources(:service => "my-software"), :delayed
end
Поваренные книги (cookbooks)
Для управления парком машин используется набор поваренных книг, многие из которых уже написаны (Opscode, 37 Signals, Engine Yard), а какие-то мы можем написать и сами (для своих приложений).
Поваренные книги состоят из метаданных (определяют зависимости между книгами, и так далее), рецептов (действий на целевом узле), определений ресурсов (сервисы и прочая), библиотек функций (просто код, который вы можете написать на Ruby), шаблонов (файлы, генерируемые на узле с помощью шаблонизатора embedded ruby), файлов (которые копируются в неизменном виде) и атрибутов (данные в формате JSON, ассоциируемые с узлом).
Кстати, важно знать, что такие базовые ресурсы, как шаблон, файл/каталог/линк (копируемый удалённо или создаваемый на месте, команда интерпретатора, пакет для вашей ОС (rpm, deb etc.), сервис init.d, пользователь Unix, репозиторий VCS, и многое другое, — уже есть в базовой поставке Chef.
Если же чего-то не хватает, это всегда можно либо найти, либо написать самому.
Примеры
Runit
Установка вашего продукта, как сервиса runit, можно выполнить, например, так:
include_recipe "runit" # It setups runit.
package "tar" do
version "1.16.1-1"
action :install
end
gem "rails" do
version "2.3.5"
end
git "our-code" do
destination "/opt/our-code"
repository "git://our-code.local/our-code.git"
reference "HEAD"
action :export
end
runit_service "our-service" do
restart_on(:deploy => "our-code")
end
По умолчанию сервис создается как разрешенный к запуску, ваши шаблоны запуска и логгирования окажутся где нужно, и далее ваш сервис всегда будет доступен для управления (up, down etc.).
Так же легко можно настроить скрипты God или Monit.