Я использовал Chef для управления IT-инфраструктурой около полутора лет, начав с версии 0.10. Сначала, где-то пол-года, использовал только для управления конфигурациями, без развертывания ПО с нуля. Затем, уже на другой работе, автоматизировал управления конфигурациями и развертывание с нуля веб-проекта (30+ серверов, Nginx, ruby, Riak, Redis, sphinx-search, RabbitMQ и т.п.). Это позволило мне составить собственное мнение o достоинствах и недостатках Chef, и в этой заметке я свое мнение излагаю.
По итогу вышеописанной деятельности я был настолько утомлен недостатками Chef, что начал искать ему замену. Был рассмотрен Puppet и набиравший тогда популярность Ansible. Для объективного сравнения я реализовал часть из того, что уже было сделано для проекта с помощью Chef, с использованием этих двух SCM. По итогу, был выбран Ansible из-за невероятной читабельности получившихся playbook-ов, хотя Puppet также во многом обошел Chef. Особенно радовала декларативность Ansible и Puppet, а вот неопределенность порядка выполнения в Puppet огорчила.
Как-бы то ни было, по итогу работы с Chef у меня сложилось такое мнение:
- В случае комплексной, динамически изменяемой среды, когда требуется на-лету перенастраивать софт в автоматическом режиме - Chef идеален. Тут его императивность приходится как раз к месту, поскольку действия выполняются сложные, и зависят от состояния системы в конкретный момент.
- В случае, когда мы имеем ограниченный набор хостов, имеющих каждый свою фиксированную роль, когда любое переконфигурирование выполнятся специалистом - Chef избыточен, и даже вреден, поскольку провоцирует писать конфиги-программы, а не конфиги-данные.
#Негатив:
- Ruby - язык хороший, но пакетировать и совмещать разные версии это ад.
- Слабочитаемый конечный конфиг, представляющий собой код на ruby. Это главный минус.
- Императивный стиль большинства рецептов.
- Жуткая ruby-мешанина в большинстве публичных рецептов, кроме как LWRP использовать оттуда нечего.
- Привязанность многих cookbooks к Ubuntu.
- Сложная, хоть и продуманная архитектура.
- Море зависимостей у клиента и сервера, проблемы с версиями Ruby. К примеру, для squeeze и ruby1.9.3 пришлось пересобрать более 10 пакетов.
- Для Debian пришлось патчить chef для обхода проблемы с неработающим update-rc.d stop, хотя в puppet уже был рабочий workaround.
#Позитив:
- Окружения (environments).
- Версии cookbook для каждого окружения, заморозка пакетов.
- Готовые cookbooks, полезно для вникания.
- Knife - отличный инстумент для любителей консоли вроде меня.