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

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

Они содержат рецепты, файлы аттрибутов, шаблоны и другие штуки для настройки.

При запуске Chef-Client рецепты, перечисленные с списке запуска узла перенаправляются на узел наравне с другим содержимым “поваренной книги”, содержащей рецепт. Эти рецепты затем применяются к узлу, приводя его в надлежащее состояние.

Обычно, единственная поваренная книга сожержит информацию, необходимую для настройки одного сервиса или одной части системы. Например, в ней может быть “поваренная книга” “users” для настройки пользователей, которые должны иметь доступ к системе и “поваренная книга” “apache” для настройки веб-сервера Apache.

“Поваренные” книги могут быть созданы любым человеком, обладающим начальными навыками программирования, и они могут быть написаны без сохранения каких-либо подробностей о развернутом окружении. Это означает, что их можно безопасно распространять и повторно использовать по всей территории организации и компании. Opscode поощряет публикацию пользователями своих “поваренных книг” на Opscode Community Site, где можно выбрать уже из более 300 “поваренных книг”. В результате, можно устанавливать и настраивать многие полезные вещи даже без написания новой “поваренной книги”.

Если репозиторий Chef использует git, можно быстро найти и использовать “поваренные книги”, написанные сообществом, используя инструмент командной строки - Knife. Например, для того, чтобы скачать простую “поваренную книгу” “getting-started”, можно запустить следующее из репозитория chef:

knife cookbook site install getting-started

Для выгрузки ее на Chef Server или Hosted Chef:

knife cookbook upload getting-started

И, для добавления рецепта “default” в эту поваренную книгу для списка запуска узла:

knife node run_list add my_node 'getting-started::default'

Chef также предоставляет инструменты для более легкого создания новой поваренной книги. Например, для создания базовой структуры новой поваренной книги в репозитории Chef, можно использовать knife:

knife cookbook create new_cookbook_name

Рецепты

Рецепты - это файлы Ruby, в которых используется Domain Specific Language (DSL) для определения того, каким образом конкретные части узла следует настраивать. Как можно будет увидеть в последующих секциях, можно использовать данные, совмещенные с возможностью использовать код ruby в рецептах для динамического изменения конфигурации узла.

“Поваренные книги” могут содержать множество рецептов, включая рецепты, добавленные в список запуска по их полному имени, используя форму COOKBOOK_NAME::RECIPE_NAME. В список запуска добавляются только роли и рецепты.

Chef, однако, предоставляет укороченную нотацию для имен рецептов и “поваренных книг” в команде списка запуска. (Это полезно для рецептов, которые используются в качестве основной конфигурации для набора узлов).

При добавлении COOKBOOK_NAME в список запуска Chef считает, что нужен рецепт с именем “default” из “поваренной книги” с тем же именем. Чтобы посмотреть на пример такого поведения, можно изменить команду knife, использованную выше, для добавления рецепта в список запуска узла. Успользуя укороченный вариант, можно просто дать команду, приведенную выше:

knife node run_list add my_node getting-started

Этом обновленном примере добавляется рецепт “default” из “поваренной книги” “getting-started” в список запуска “my_node”, как и прежде.

Ресурсы и Провайдеры

Ресурсы - это строительные блоки, которые будут использоваться для создания должным образом настроенного узла. Они представляют собой крос-платформенную абстракцию того, что настраивается на узле - отдельные куски конфигурации системы, которые помещены в рецепты и применяются к узлам.

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

Например, следующий ресурс добавляет пользователя на узел:

user "sam" do
  home "/home/sam"
  shell "bin/zsh"
  comment "Sam loves DevOps"
  action :create
end

Этот ресурс описывает пользователя, “sam”, которого необходимо создать на узле. В действительности создание производится Провайдером, который выполняет команды, необходимые для создания нового пользователя.

Отдельные ресурсы могут иметь множество провайдеров, каждый из которых знает, как выполнить необходимые задачи на различных платформах. Chef-client выберет лучшего провайдера для платформы узла. Таким образом, описание этого едиснтвенного ресурса можеь быть использовано для создания пользователя “sam” на Linux-системе и FreeBSD-системе, без каких-либо изменений.

Ресурс пользователя, описанный выше, структурирован так же, как все описания ресурсов в Chef Domain Specific Language (DSL):

resource_type "resource_name" do
  resource_attribute value
  ...
end

Тип ресурса относится к виду ресурса, который необходимо настроить. Многие различные ресурсы определяются при помощи Chef DSL. Полный список этих ресурсов можно найти на странице Ресурсы. Обладая глубокими знаниями Chef, можно даже расширить Chef DSL с помощью собственных ресурсов.

Имя ресурса - это строка, идентифицирующая этот специфичный экзмепляр ресурса. Для конфигурации конкретного узла может потребоваться определение множества ресурсов пользователей, каждый из которых будет иметь свое собственное имя и может быть направлен к другому ресурсу. Имя ресурса, также, по умолчанию, используется как значение для одного из “аттрибутов ресурса”. Например, в ресурсе пользователя, описанном выше, имя “sam” будет использоваться в качестве имени пользователя для пользователя, которого создаст chef-client.

Аттрибуты ресурса и относящиеся к ним значения описвают желаемое состояние ресурса. Каждый ресурс обладает различными аттрибутами, важными в контексте данного ресурса. Аттрибут “action” - это аттрибут, использующийся всеми ресурсами и определяющий, что должно произойти с этим ресурсом. В примере выше, действие “create” указывает, что требуется создать пользователя. Когда sam покинет организацию, можно изменить это действие на “:delete” для удаления пользователя.

Доступные аттрибуты ресурса и их значения по умолчанию подробно описываются на странице Ресурсы.

Когда chef-client загружает рецепты с свой список запуска.

  1. он запускает каждый рецепт как часть кода ruby
  2. каждый раз, когда ресурс используется, он добавляетя в коллекцию ресурсов для этого узла
  3. затем провайдеры этих ресурсов принимают решение действовать или нет для выполнения описания ресурсов.

Таким образом, ключевым принципом Chef является достижение: идемпотентность. Идемпотентность позволяет убедиться, что ресурс может применяться к машине множество раз и всегда будет получен тот же самый результат: должным образом настроенная машина.

Аттрибуты и Шаблоны

Аттрибуты обеспечивают хранение вложенных пар ключ-значение данных об узле и его конфигурации. Некоторые аттрибуты автоматически собираются на старте каждого запуска chef-client и включают такую информацию, как IP-адрес узлов, имя хоста или загруженные модули ядра. Другие аттрибуты добавляются из других источников, например, “поваренные книги”. (Роли и Окружения также могут устанавливать аттрибуты, об этом будет написано далее).

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

Например, далее устанавливаются некоторые разумные значения по умолчанию для расположения определенного конфигурационного файла:

default["my_application"]["config_location"] = "/etc/myapp.conf"

Затем этот аттрибут может использоваться напрямую при контроле ресурсов конфигурационного файла:

template node["my_application"]["config_location"] do
  action :create
end

Определение Шаблона, который является особенностью Chef, позволяет создавать общие файлы, содержание которых может быть сгенерировано автоматически. Если этот файл конфигурации много раз упоминался в рецепте, изменение его расположения - причина изменения одного аттрибута.

Аттрибуты узла также содержат игформацию об узле, которая может использоваться в рецепте:

if node.attribute?("ec2")
  # Выполнить специфичные для EC2 задачи.
end

Это позволит рецепту выполнить некий набор задач по настройке только в том случае, если он был запущен в облаке Amazon EC2. За полной информацией об Аттрибутах необходимо обратиться к следующей странице.

Роли

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

В случае, если в списке запуска узла находится роль, список запуска самой роли расширяется и добавляется к списку запуска узла, чтобы быть уверенным, что все рецепты для указанной роли применены к узлу.

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

Окружения

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

Можно создавать и управлять окружениями множеством способов, адаптируя их для удовлетворения сосбтвенных нужд и нужд инфраструктуры. Обратитесь к странице Окружения для получения подробностей.

Кратко об описанном

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