Ссылка на оригинал

Чтобы научиться использовать Chef, необходимо понимать, что из себя представляет каждый его компонент и каким образом они работают вместе. (http://wiki.opscode.com/display/chef/Core+Components)

Создание инфраструктуры

Узлы

Узел - это хост, на котором работает клиент Chef. Основная особенность узла, с точки зрения Chef, - его аттрибуты и его список запуска. Узлы - это те вещи, к которым применяются Рецепты и Роли. Для работы с Узлами в любое время потребуется:

  • добавить рецепт в систему
  • обновить аттрибуты

Список запуска (run_list)

В простейшем случае, “список запуска” - это список рецептов, которые узел запускает. При условии, что метаданные “поваренной книги” корректные, можно просто поместить рецепт, который необходимо запустить, в “список запуска”, и зависимые рецепты будут запущены автоматически при необходимости. Порядок важен: порядок, в котором рецепты перечислены в “списке запуска”, в точности соответствует тому, в котором chef будет их запускать.

При более продвинутом использовании, “список запуска” будет включать роли, назначенные узлу в дополнение к любому явно назначенному набору рецептов. В этом случае, когда клиент Chef запускается, “список запуска” “растягивается” в список рецептов, замещая записи роли в “списке запуска” списком рецептов роли, указанным в “списке запуска”.

Аттрибуты узла

Узлы и роли связаны аттрибутами, которые представляют собой структуру вложенных пар ключ - значение. Аттрибуты узлов и ролей в целом используются в качестве основы для аттрибутов ресурсов. Например, сервер может использовать одну версию nginx, но необходимо установить версию новее на тестовый сервер для проверки. Используя аттрибуты узла или роли для указания версии, можно использовать один и тот же рецепт как для одного, так и для другого окружения.

Chef позволяет устанавливать аттрибуты в файлах аттрибутов (кроме мириада других способов). Код в этих файлах доступен узлу, на котором работает chef, и управляет аттрибутами на этом узле напрямую. В терминах ruby, значение self в файлах аттрибутов - это сам узел. Используя эти фйлы, можно рассчитывать, что узел имеет нормальное значение для аттрибута, когда рецепт пишется без учета того, что узел может не иметь определения этого аттрибута.

Продвинутые пользователи Chef часто активно используют аттрибуты, определенные в ролях, для управления аттрибутами на нескольких узлах сразу.

Роли

Роль предоставляет возможность группировать подобные возможности подобных узлов. В масштабе веба, почти никогда не бывает чего-то одного, так что можно использовать роли для представления частей конфигурации, которые будут общими для группы узлов. Роли состоят из тем же частей, что и узлы: аттрибуты и “списки запуска”. Когда клиент Chef запускается, он объединяет свои собственные аттриуты и “список запуска” с теми из ролей, которые ему были назначены.

Настройка Узлов

Поваренные книги (Cookbooks)

“Поваренная книга” - это набор рецептов, определений ресурсов, аттрибутов, библиотеки, файла “поваренной книги” и файлов шаблонов, которые chef использует для настройки системы, плюс метаданные. “Поваренные книги” обычно концентрируются вокруг настройки одного пакета или сервиса. “Поваренная книга” MySQL, например, содержит рецепты как для клиента, так и для сервера, плюс файл аттрибутов для настройки по умолчанию для значений, которые могут меняться.

“Поваренные книги” - единица распространения и общего доступа в Chef. Большую часть времени использования Chef составляет написание “поваренных книг”.

Рецепты

Рецепты - это файлы, куда записываются Ресурсы (рассмотренные ниже). Рецепты могут также содержать произвольный код на Ruby, однако необходимо понимать немного, как Chef использует это. Каждый запуск Chef - процесс из двух стадий: на первой, вызывается компиляция, Chef проверяет файлы рецептов, создавая список ресурсов. На следующей стадии, Chef выполняет желаемое действие для каждого ресурса на провайдере этого ресурса. Любой произвольный код в рецепте будет запущен на этапе компиляции, а не на этапе выполнения. Для того, чтобы отложит выполнение до этапа выполнения, используется ресурс ruby_block.

Метаданные

“Поваренные” книги часто ссылаются на “поваренных книгах” как необходимое условие. Чтобы сервер знал, какие “поваренные книги” необходимо отправить клиенту, “поваренной книге”, зависящей от других, необходимо показать, что эта зависимость где-то находится. Это “где-то находится” и есть в метаданных “поваренной книги”. Зависимость отслеживается в большей видимой части метаданных, но метаданные могут также содержать информацию об авторстве, лицензии, описание “поваренной книги”, какая платформа требуется для работы на ней, и будет или нет “поваренная книга” нормально работать с другими. На данный момент Chef поддерживает намного больше полей для метаданных, чем реально используется, но поддержка произвольной информации о зависимостях абсолютно необходима, поскольку иначе узлы могут не получить все требуемые “поваренные книги” по причине неполной информации.

Ресурсы

Ресурс - как правило, кросс-платформенная абстракция того, что настраивается на хосте. Например, пакеты могут быть установлены через apt, yum или порты и пакетную систему BSD, но ресурс пакетов абстрагируется от этих разных способов, что позволяет просто указать, что пакет должен быть установлен кросс-платформенным способом. Ресурсы Chef по большей части просто контейнеры для данных, с некоторой функциональностью базовой проверки.

Ресурсы декларируются в Рецептах и Определениях. Они являются базовой частью работы в Chef.

Аттрибуты Ресурсов

Как уже упоминалось, ресурсы, по большей части, являются контейнерами для данных. Аттрибуты же - это части данных, которые эти ресурсы содержат. В случае управления пакетами, это может быть имя пакеты, который необходимо установить, версия его для установки или опции, передаваемые менеджеру пакетов.

Аттрибуты или Параметры Ресурса. Разработчики Chef обсуждали переименовывать ли Аттрибуты Ресурса в “параметры” для переопределения термина “аттрибут”, так как этот термин также используется для описания данных, относящихся к узлам и ролям. Текущий документ использует термин “аттрибут”, и необходимо помнить, что его значения отличается от значения аттрибутов узлов.

Действия

Действие - это то, что от Chef требуется сделать с ресурсом: должен ли быть пакет установлен? Обновлен ли до новой версии? Удален? Действия, в основном, специфичны для ресурса, но все ресурсы поддерживают действие “ничего”, смысл которого заключен в его имени.

Провайдер

Провайдер - это специфичная для платформы реализация того, что ресурс абстрагирует. На Red Hat или CentOS ресурс пакетов будет использовать провайдер пакетов yum для установки пакетов, а на Debian или Ubuntu будет использоваться провайдер apt. Провайдеры очень разумны: они несут ответственность за идемпотентность Chef’а, проверяя, необходимо ли применить действие, и отправляя команду системе для применение действия. В случае провайдеров пакетов, они сначала проверяют, установлена ли нужная версия пакета, и запускают, при необходимости, yum, apt или другие менеджеры пакетов для установки или обновления. При работе с Chef обычно не нужно беспокоиться о провайдерах. В случае, когда это делается, Chef предоставляет ресурсы “для ускорения”, которые всегда используют нужные провайдеры. Например, ресурсы dpkg_package и rpm_package позволяют установить пакет напрямую с файловой системы, используя провайдеры, специфичные для этих менеджеров пакетов.

Провайдеры применяют действия на Ресурсах. Конкретный Узел выбирает, что Провайдер должен использовать для Ресурса по умолчанию, или Ресурс может указать конкретного провайдера.

Поиск

Поиск создан Chef’ом и позволяет запрашивать произвольные данные об инфраструктуре. Наиболее часто, этот сервис используется при поиске вызова в рецепте.

Data Bags

Data Bags хранит вложенные данные ключ-значение (как аттрибуты) на сервере chef. По данным Data Bag можно искать, также они могут быть загружены напрямую по имени в рецепте. Data bags глобальны для установки chef-server - их можно представить как аттрибуты всей инфраструктуры.

Окружения

Окружения предоставляют механизм управления такими различными архитектурными сегментированными пространствами, как “production”, “staging”, “development”, “testing” и т.д. с единственным экземпляром Chef (или одной организацией, в случае, Hosted Chef). С помощью окружений можно указать список запуска в роли для конкретного окружения, версию “поваренной книги” и аттрибуты: это позволяет установить политики для указания того, какая версия конкретной поваренной книги можеь быть использована в сегменте инфраструктуры. Окружения не являются множеством ограничений конкретных взаимодействий на единой системе, они действуют в качестве ограничения версии “поваренной книги” над сгруппированными системами, на которые распространяется использование - например: development, test, production - где существуют серверы приложений и серверы баз данных. Роли - это сгруппированные системы, которые действуют как функции и которые могут распространяться на окружения - например: сервер приложений, веб-сервер, сервер баз данных. Таким образом, можно иметь “списки запуска” для каждого окружения внутри ролей - например: в окружении development требуется, чтобы сервер приложений подключался к другому балансировщику нагрузки, который работает в тестовом окружении - которые включены в тот же самый рецепт.

Управление Chef

Knife

Knife - интерфес командной строки для сервера Chef, с помощью которого также предоставляются некоторые возможности, полезные для chef-solo как вариант.

Консоль Управления

Консоль Управления - это графический веб-интерфейс для API chef-server. Многие компоненты могут управляться через эту консоль, включая пользователей, узлы, роли, поваренные книги, data bags и API клиентов. Поиск также может производиться через консоль. Консоль Управления Hosted Chef также позволяет клиентам редактирвоать информацию в собственном профилде пользователя, например, информацию об учетной записи или биллинг, а также управлять Авторизацией Hosted Chef.

Shef

Shef - это интерактивная консоль chef - она позволяет создавать, запускать и проверять рецепты интерактивно.