Spec-Zone.ru › Chef 16

Об атрибутах

[править на GitHub]

Атрибут — это конкретная деталь о узле. Атрибуты используются клиентом Chef Infra для понимания:

  • Текущего состояния узла
  • Состояния узла по завершении предыдущего выполнения клиента Chef Infra
  • Желаемого состояния узла по завершении текущего выполнения клиента Chef Infra

Атрибуты определяются:

  • Состоянием самого узла
  • Атрибутами, переданными через JSON в командной строке
  • Кулинарными книгами (в файлах атрибутов и/или рецептах)
  • Ролями
  • Средами
  • Файлами политики

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

  • Атрибуты, переданные через JSON в командной строке
  • Данные о узле, собранные с помощью [Ohai].
  • Объект узла, сохранённый на сервере Chef Infra по завершении предыдущего выполнения клиента Chef Infra.
  • Перестроенный объект узла из текущего выполнения клиента Chef Infra, после обновления для изменений в кулинарных книгах (файлах атрибутов и/или рецептах), ролей и/или сред, и обновлённый для любых изменений в состоянии самого узла.

После перестроения объекта узла все атрибуты сравниваются, а затем узел обновляется на основе приоритета атрибутов. По завершении каждого выполнения клиента Chef Infra объект узла, определяющий текущее состояние узла, загружается на сервер Chef Infra, чтобы его можно было индексировать для поиска.

Итак, как клиент Chef Infra определяет, какое значение должно быть применено? Читайте дальше, чтобы узнать больше о работе с атрибутами, включая типы атрибутов, места хранения атрибутов и как клиент Chef Infra выбирает, какой атрибут применить.

Сохранение атрибутов

Все атрибуты, кроме обычных, сбрасываются в начале выполнения клиента Chef Infra. Атрибуты, установленные с помощью chef-client -j с JSON-файлом, имеют обычный приоритет и сохраняются между выполнениями клиента Chef Infra. Клиент Chef Infra перестраивает эти атрибуты, используя автоматически собранные атрибуты Ohai в начале каждого выполнения клиента Chef Infra, а затем использует атрибуты по умолчанию и переопределения, указанные в кулинарных книгах, ролях, средах и файлах политики. Затем все атрибуты объединяются и применяются к узлу в соответствии с приоритетом атрибутов. Применённые к узлу атрибуты сохраняются на сервере Chef Infra в качестве части объекта узла по завершении каждого выполнения клиента Chef Infra.

Типы атрибутов

Клиент Chef Infra использует шесть типов атрибутов для определения значения, применяемого к узлу во время выполнения клиента Chef Infra. Кроме того, клиент Chef Infra собирает значения атрибутов из до пяти источников. Комбинация типов атрибутов и источников формирует до 15 различных конкурирующих значений, доступных во время выполнения клиента Chef Infra:

Тип атрибута Описание
default Атрибут default автоматически сбрасывается в начале каждого выполнения клиента Chef Infra и имеет самый низкий приоритет атрибута. Используйте атрибуты default в кулинарных книгах как можно чаще.
force_default Используйте атрибут force_default для обеспечения того, что атрибут, определённый в кулинарной книге (файлом атрибутов или рецептом), имеет приоритет над атрибутом default , установленным ролью или средой.
normal Атрибут normal — это параметр, который сохраняется в объекте узла. Атрибут normal имеет более высокий приоритет атрибута, чем атрибут default .
override Атрибут override автоматически сбрасывается в начале каждого выполнения клиента Chef Infra и имеет более высокий приоритет, чем атрибуты default, force_default, и normal. Атрибут override чаще всего указывается в рецепте, но может быть указан в файле атрибутов, для роли и/или для среды. Кулинарная книга должна быть написана так, чтобы использовать атрибуты override только в необходимых случаях.
force_override Используйте атрибут force_override для обеспечения того, что атрибут, определённый в кулинарной книге (файлом атрибутов или рецептом), имеет приоритет над атрибутом override , установленным ролью или средой.
automatic Атрибут automatic содержит данные, идентифицированные Ohai в начале каждого выполнения клиента Chef Infra. Атрибут automatic не может быть изменён и всегда имеет наивысший приоритет атрибута.

Источники атрибутов

Атрибуты предоставляются клиенту Chef Infra из следующих мест:

  • JSON-файлы, переданные через chef-client -j
  • Узлы (собраны Ohai в начале каждого выполнения клиента Chef Infra)
  • Файлы атрибутов (в кулинарных книгах)
  • Рецепты (в кулинарных книгах)
  • Среды
  • Роли
  • Файлы политики

Примечания:

  • Многие атрибуты хранятся в chef-repo для файлов политики, сред, ролей и кулинарных книг (файлов атрибутов и рецептов)
  • Многие атрибуты собираются Ohai на каждом отдельном узле в начале каждого выполнения клиента Chef Infra
  • Атрибуты, хранящиеся в chef-repo, загружаются на сервер Chef Infra со станцией периодически
  • Клиент Chef Infra загрузит объект узла с сервера Chef Infra, а затем сбросит все атрибуты, кроме normal. Объект узла будет содержать данные атрибутов из предыдущего выполнения клиента Chef Infra, включая атрибуты, установленные с JSON-файлами через -j.
  • Клиент Chef Infra обновит кулинарные книги на узле (если необходимо), что обновит атрибуты, содержащиеся в файлах атрибутов и рецептах
  • Клиент Chef Infra обновит данные роли и среды (если необходимо)
  • Клиент Chef Infra перестроит список атрибутов и применит приоритет атрибутов при конфигурации узла
  • Клиент Chef Infra отправит объект узла на сервер Chef Infra в конце выполнения клиента Chef Infra; обновлённый объект узла на сервере Chef Infra затем индексируется для поиска и хранится до следующего выполнения клиента Chef Infra

Автоматические (Ohai)

Автоматический атрибут — это конкретная деталь о узле, например, IP-адрес, имя хоста, список загруженных модулей ядра и так далее. Автоматические атрибуты обнаруживаются Ohai и затем используются клиентом Chef Infra для правильного их обработки во время каждого выполнения клиента Chef Infra. Наиболее часто используемые автоматические атрибуты:

Атрибут Описание
node['platform'] Платформа, на которой работает узел. Этот атрибут помогает определить, какие поставщики будут использоваться.
node['platform_family'] Семейство платформ — это специфическая группировка сходных платформ Chef Infra, где часто можно использовать код кулинарной книги. Например, `rhel` включает Red Hat Linux, Oracle Linux, CentOS и несколько других платформ, почти идентичных Red Hat Linux.
node['platform_version'] Версия платформы. Этот атрибут помогает определить, какие поставщики будут использоваться.
node['ipaddress'] IP-адрес узла. Если у узла есть шлюз по умолчанию, это IPV4-адрес интерфейса. Если у узла нет шлюза по умолчанию, значение этого атрибута должно быть nil. IP-адрес шлюза по умолчанию — рекомендуемое значение по умолчанию.
node['macaddress'] MAC-адрес узла, определённый тем же интерфейсом, который обнаруживает node['ipaddress'].
node['fqdn'] Полное доменное имя узла. Оно используется в качестве имени узла, если не указано иное.
node['hostname'] Имя хоста узла.
node['domain'] Домен узла.
node['recipes'] Список рецептов, связанных с узлом (и являющихся частью списка выполнения этого узла).
node['roles'] Список ролей, связанных с узлом (и являющихся частью списка выполнения этого узла).
node['ohai_time'] Время последнего запуска Ohai. Этот атрибут не часто используется в рецептах, но он сохраняется на сервере Chef Infra и может быть получен с помощью подкоманды knife status .

Ohai собирает список автоматических атрибутов в начале каждого выполнения клиента Chef Infra. Этот список будет отличаться в разных организациях, в зависимости от типа сервера и платформы, на которой работают эти сервера. Все атрибуты, собранные Ohai, не могут быть изменены клиентом Chef Infra. Выполните команду ohai на системе, чтобы увидеть, какие автоматические атрибуты Ohai собрал для конкретного узла.

Файлы атрибутов

Файл атрибутов находится в подкаталоге attributes/ для кулинарной книги. При запуске кулинарной книги на узле атрибуты, содержащиеся во всех файлах атрибутов, оцениваются в контексте объекта узла. Методы узла (если присутствуют) используются для установки значений атрибутов на узле. Например, кулинарная книга apache2 содержит файл атрибутов, называемый default.rb, который содержит следующие атрибуты:

default['apache']['dir']          = '/etc/apache2'
default['apache']['listen_ports'] = [ '80','443' ]

Использование объекта узла (node) подразумевается в предыдущем примере; следующий пример определяет сам объект узла как часть атрибута:

node.default['apache']['dir']          = '/etc/apache2'
node.default['apache']['listen_ports'] = [ '80','443' ]

Порядок оценки атрибутов

Клиент Chef Infra оценивает атрибуты в порядке, определённом списком выполнения, включая любые атрибуты, которые включены в список выполнения из-за зависимостей кулинарных книг.

Использование файлов атрибутов

Атрибут — это конкретная деталь о узле, например, IP-адрес, имя хоста, список загруженных модулей ядра, версии доступных языков программирования и т. д. Атрибут может быть уникальным для конкретного узла или идентичным для каждого узла в организации. Атрибуты чаще всего устанавливаются из кулинарной книги, с помощью knife или извлекаются Ohai с каждого узла перед каждым запуском клиента Chef Infra. Все атрибуты индексируются для поиска на сервере Chef Infra. Хорошие кандидаты для атрибутов включают:

  • любая кроссплатформенная абстракция для приложения, например, путь к файлу конфигурации
  • значения по умолчанию для настраиваемых параметров, такие как объем памяти, выделенной процессу, или количество запускаемых рабочих процессов
  • любой элемент, который может потребоваться сохранить в данных узла между запусками Chef Infra Client

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

Один подход заключается в установке атрибутов на одном уровне приоритета, задавая атрибуты в файлах атрибутов кулинарии, а затем также устанавливая те же атрибуты по умолчанию (но с разными значениями) с помощью роли. Атрибуты, установленные в роли, будут глубоко объединены поверх атрибутов из файла атрибутов, и атрибуты, установленные ролью, будут иметь приоритет над атрибутами, указанными в файлах атрибутов кулинарии.

Другой (намного менее распространенный) подход заключается в установке значения только в том случае, если у атрибута нет значения. Это можно сделать, используя варианты _unless методов приоритета атрибутов:

  • default_unless
  • normal_unless

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

Методы файлов

Используйте следующие методы в файле атрибутов для кулинарии или в рецепте. Эти методы соответствуют типу атрибута с тем же именем:

  • override
  • default
  • normal
  • _unless

attribute?

Полезный метод, связанный с атрибутами, — это метод attribute?. Этот метод проверяет наличие атрибута, чтобы обработка могла выполняться в файле атрибутов или рецепте, но только если конкретный атрибут существует.

Использование attribute?() в файле атрибутов:

if attribute?('ec2')
  # ... set stuff related to EC2
end

Использование attribute?() в рецепте:

if node.attribute?('ec2')
  # ... do stuff on EC2 nodes
end

Рецепты

Рецепты являются основными элементами конфигурации. Рецепт:

  • написан на языке Ruby, который разработан для предсказуемого чтения и поведения
  • в основном представляет собой набор ресурсов, определённых с использованием шаблонов (имена ресурсов, пары «атрибут-значение» и действия); вспомогательный код добавляется вокруг этого с помощью Ruby, при необходимости
  • должен определять все необходимое для настройки части системы
  • должен храниться в кулинарии
  • может включаться в другой рецепт
  • может использовать результаты запроса поиска и читать содержимое мешка данных (включая зашифрованный мешок данных)
  • может иметь зависимость от одного (или нескольких) рецептов
  • должен быть добавлен в список выполнения перед использованием Chef Infra Client
  • всегда выполняется в том же порядке, что и в списке выполнения

Атрибут может быть определён в кулинарии (или рецепте) и затем использован для переопределения значений по умолчанию на узле. Когда кулинария загружается во время выполнения Chef Infra Client, эти атрибуты сравниваются с атрибутами, которые уже присутствуют на узле. Атрибуты, определенные в файлах атрибутов, сначала загружаются в соответствии с порядком кулинарии. Для каждой кулинарии атрибуты в файле default.rb загружаются первыми, а затем дополнительные файлы атрибутов (если они есть) загружаются в лексикографическом порядке. Когда атрибуты кулинарии имеют приоритет над атрибутами по умолчанию, Chef Infra Client применяет эти новые настройки и значения во время выполнения Chef Infra Client на узле.

Роли

Роль — это способ определения определённых шаблонов и процессов, которые существуют на всех узлах организации как принадлежащие одной функциональной задаче. Каждая роль состоит из нуля (или более) атрибутов и списка выполнения. Каждому узлу может быть назначена нулевая (или более) ролей. При запуске роли на узле детали конфигурации этого узла сравниваются с атрибутами роли, а затем содержимое списка выполнения этой роли применяется к деталям конфигурации узла. При запуске Chef Infra Client он объединяет собственные атрибуты и списки выполнения с теми, что содержатся в каждой назначенной роли.

Атрибут может быть определен в роли и затем использован для переопределения значений по умолчанию на узле. Когда роль применяется во время выполнения Chef Infra Client, эти атрибуты сравниваются с атрибутами, которые уже присутствуют на узле. Если атрибуты роли имеют приоритет над атрибутами по умолчанию, Chef Infra Client применяет эти новые настройки и значения во время выполнения.

Атрибут роли может быть установлен только как атрибут по умолчанию или атрибут переопределения. Атрибут роли не может быть установлен как обычный атрибут. Используйте методы default_attribute и override_attribute в файле Ruby DSL или хеши default_attributes и override_attributes в файле данных JSON.

Среды

Среда — это способ сопоставления реального рабочего процесса организации с тем, что можно настроить и управлять с использованием Chef Infra. Это сопоставление достигается установкой атрибутов и привязкой кулинарий на уровне среды. С помощью сред вы можете изменять конфигурации кулинарий в зависимости от назначения системы. Например, определив разные среды разработки и производства, вы можете определить правильный URL сервера базы данных для каждой среды. Среды также позволяют организациям уверенно переносить новые выпуски кулинарий из среды разработки в производство, проходя выпуски через тестовые среды перед запуском в производство.

Атрибуты могут быть определены в среде и затем использованы для переопределения атрибутов по умолчанию в кулинарии. Когда среда применяется во время выполнения Chef Infra Client, атрибуты среды сравниваются с атрибутами, которые уже присутствуют на узле. Если атрибуты среды имеют приоритет над атрибутами по умолчанию, Chef Infra Client применяет эти новые настройки и значения во время выполнения.

Атрибуты среды могут быть установлены на уровне атрибута default или на уровне атрибута override.

Приоритет атрибутов

Атрибуты всегда применяются Chef Infra Client в следующем порядке:

  1. Атрибут default в файле атрибутов кулинарии
  2. Атрибут default в рецепте
  3. Атрибут default в среде
  4. Атрибут default в роли
  5. Атрибут force_default в файле атрибутов кулинарии
  6. Атрибут force_default в рецепте
  7. Атрибут normal в файле JSON, переданном через chef-client -j
  8. Атрибут normal в файле атрибутов кулинарии
  9. Атрибут normal в рецепте
  10. Атрибут override в файле атрибутов кулинарии
  11. Атрибут override в рецепте
  12. Атрибут override в роли
  13. Атрибут override в среде
  14. Атрибут force_override в файле атрибутов кулинарии
  15. Атрибут force_override в рецепте
  16. Атрибут automatic, определенный Ohai в начале выполнения Chef Infra Client

где последний атрибут в списке — тот, который применяется к узлу.

Примечание

Порядок приоритета атрибутов для ролей и сред инвертируется для атрибутов default и override. Порядок приоритета для атрибутов default — среда, затем роль. Порядок приоритета для атрибутов override — роль, затем среда. Применение атрибутов среды override после атрибутов роли override позволяет использовать одну и ту же роль в нескольких средах, но гарантирует, что значения могут быть установлены специфичные для каждой среды (при необходимости). Например, роль сервера приложений может существовать во всех средах, но одна среда может использовать сервер базы данных, отличающийся от других сред.

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

image

Приоритет атрибутов, представленный в виде таблицы:

image

Примеры

Следующие примеры расположены от низкого к высокому приоритету.

Атрибут по умолчанию в /attributes/default.rb

default['apache']['dir'] = '/etc/apache2'

Атрибут по умолчанию в объекте узла в рецепте

node.default['apache']['dir'] = '/etc/apache2'

Атрибут по умолчанию в /environments/environment_name.rb

default_attributes({ 'apache' => {'dir' => '/etc/apache2'}})

Атрибут по умолчанию в /roles/role_name.rb

default_attributes({ 'apache' => {'dir' => '/etc/apache2'}})

Обычный атрибут, заданный как атрибут кулинарии

set['apache']['dir'] = '/etc/apache2'
normal['apache']['dir'] = '/etc/apache2'  #set is an alias of normal.

Обычный атрибут, заданный в рецепте

node.normal['apache']['dir'] = '/etc/apache2'

Атрибут переопределения в /attributes/default.rb

override['apache']['dir'] = '/etc/apache2'

Атрибут переопределения в /roles/role_name.rb

override_attributes({ 'apache' => {'dir' => '/etc/apache2'}})

Атрибут переопределения в /environments/environment_name.rb

override_attributes({ 'apache' => {'dir' => '/etc/apache2'}})

Атрибут переопределения в объекте узла (из рецепта)

node.override['apache']['dir'] = '/etc/apache2'

Обеспечение того, что атрибут по умолчанию имеет приоритет над другими атрибутами

Когда атрибут по умолчанию задан так:

default['attribute'] = 'value'

любое значение, установленное ролью или средой, его заменит. Чтобы предотвратить это, используйте приоритет атрибута force_default:

force_default['attribute'] = 'I will crush you, role or environment attribute'

или:

default!['attribute'] = "The '!' means I win!"

Обеспечение того, что атрибут переопределения имеет приоритет над другими атрибутами

Когда атрибут переопределения задан так:

override['attribute'] = 'value'

любое значение, установленное ролью или средой, его заменит. Чтобы предотвратить это, используйте приоритет атрибута force_override:

force_override['attribute'] = 'I will crush you, role or environment attribute'

или:

override!['attribute'] = "The '!' means I win!"

Изменение атрибутов

Уровни приоритета атрибутов могут быть:

  • Удалены для определенного, именованного уровня приоритета атрибутов.
  • Удалены для всех уровней приоритета атрибутов.
  • Полностью присвоенные атрибуты.

Удаление уровня приоритета

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

Для атрибутов по умолчанию:

  • node.rm_default('foo', 'bar')

Для нормальных атрибутов:

  • node.rm_normal('foo', 'bar')

Для переопределяющих атрибутов:

  • node.rm_override('foo', 'bar')

Эти шаблоны возвращают вычисленное значение удаляемого ключа для указанного уровня приоритета.

Примеры

Следующие примеры показывают, как удалить определенный, именованный уровень приоритета атрибутов.

Удаление значения по умолчанию, когда существуют только значения по умолчанию

Учитывая следующую структуру кода в 'foo':

node.default['foo'] = {
  'bar' => {
    'baz' => 52,
    'thing' => 'stuff',
  },
  'bat' => {
    'things' => [5, 6],
  },
}

И некоторые атрибуты ролей:

# Please don't ever do this in real code :)
node.role_default['foo']['bar']['thing'] = 'otherstuff'

И атрибут force:

node.force_default['foo']['bar']['thing'] = 'allthestuff'

При удалении уровня приоритета атрибутов по умолчанию node['foo']['bar']:

node.rm_default('foo', 'bar') #=> {'baz' => 52, 'thing' => 'allthestuff'}

Что осталось в 'foo' - только 'bat':

node.attributes.combined_default['foo'] #=> {'bat' => { 'things' => [5,6] } }

Удаление по умолчанию без изменения атрибутов с более высоким приоритетом

Учитывая следующую структуру кода:

node.default['foo'] = {
  'bar' => {
    'baz' => 52,
    'thing' => 'stuff',
  },
  'bat' => {
    'things' => [5, 6],
  },
}

И некоторые атрибуты ролей:

# Please don't ever do this in real code :)
node.role_default['foo']['bar']['thing'] = 'otherstuff'

И атрибут force:

node.force_default['foo']['bar']['thing'] = 'allthestuff'

А также некоторые переопределяющие атрибуты:

node.override['foo']['bar']['baz'] = 99

То же удаление, что и прежде:

node.rm_default('foo', 'bar') #=> { 'baz' => 52, 'thing' => 'allthestuff' }

Другие уровни приоритета атрибутов не затронуты:

node.attributes.combined_override['foo'] #=> { 'bar' => {'baz' => 99} }
node['foo'] #=> { 'bar' => {'baz' => 99}, 'bat' => { 'things' => [5,6] }

Удаление переопределения без изменения атрибутов с более низким приоритетом

Учитывая следующую структуру кода, содержащую атрибут переопределения:

node.override['foo'] = {
  'bar' => {
    'baz' => 52,
    'thing' => 'stuff',
  },
  'bat' => {
    'things' => [5, 6],
  },
}

с единственным значением по умолчанию:

node.default['foo']['bar']['baz'] = 11

и атрибут force для каждого уровня приоритета атрибутов:

node.force_default['foo']['bar']['baz'] = 55
node.force_override['foo']['bar']['baz'] = 99

Удалить переопределение:

node.rm_override('foo', 'bar') #=> { 'baz' => 99, 'thing' => 'stuff' }

Другие уровни приоритета атрибутов не затронуты:

node.attributes.combined_default['foo'] #=> { 'bar' => {'baz' => 55} }

Удаление несуществующего ключа возвращает nil

node.rm_default("no", "such", "thing") #=> nil

Удаление всех уровней

Все уровни приоритета атрибутов могут быть удалены с помощью следующего синтаксического шаблона:

  • node.rm('foo', 'bar')

Примечание

Использование node['foo'].delete('bar') вызовет исключение, указывающее на новую API.

Примеры

Следующие примеры показывают, как удалить все уровни приоритета атрибутов.

Удаление всех уровней приоритета атрибутов

Учитывая следующую структуру кода:

node.default['foo'] = {
  'bar' => {
    'baz' => 52,
    'thing' => 'stuff',
  },
  'bat' => {
    'things' => [5, 6],
  },
}

С атрибутами переопределения:

node.override['foo']['bar']['baz'] = 999

Удаление ключа 'bar' возвращает вычисленное значение:

node.rm('foo', 'bar') #=> {'baz' => 999, 'thing' => 'stuff'}

Глядя на 'foo', всё, что осталось – это запись 'bat':

node['foo'] #=> {'bat' => { 'things' => [5,6] } }

Удаление несуществующего ключа возвращает nil

node.rm_default("no", "such", "thing") #=> nil

Полное присвоение

Используйте ! для очистки ключа для указанного уровня приоритета атрибутов, а затем завершите запись, используя один из следующих синтаксических шаблонов:

  • node.default!['foo']['bar'] = {...}
  • node.force_default!['foo']['bar'] = {...}
  • node.normal!['foo']['bar'] = {...}
  • node.override!['foo']['bar'] = {...}
  • node.force_override!['foo']['bar'] = {...}

Примеры

Следующие примеры показывают, как удалить все уровни приоритета атрибутов.

Только один компонент

Учитывая следующую структуру кода:

node.default['foo']['bar'] = {'a' => 'b'}
node.default!['foo']['bar'] = {'c' => 'd'}

'!' привело к перезаписи всего ключа ‘bar’:

node['foo'] #=> {'bar' => {'c' => 'd'}

Несколько компонентов; один «после»

Учитывая следующую структуру кода:

node.default['foo']['bar'] = {'a' => 'b'}
# Please don't ever do this in real code :)
node.role_default['foo']['bar'] = {'c' => 'd'}
node.default!['foo']['bar'] = {'d' => 'e'}

Запись '!' перезаписала значение «cookbook-default» для 'bar', но так как данные роли расположены позже в списке разрешения, они не пострадали:

node['foo'] #=> {'bar' => {'c' => 'd', 'd' => 'e'}

Несколько компонентов; все «до»

Учитывая следующую структуру кода:

node.default['foo']['bar'] = {'a' => 'b'}
# Please don't ever do this in real code :)
node.role_default['foo']['bar'] = {'c' => 'd'}
node.force_default!['foo']['bar'] = {'d' => 'e'}

После force_default! данных под 'bar' больше нет:

node['foo'] #=> {'bar' => {'d' => 'e'}

Несколько уровней приоритета

Учитывая следующую структуру кода:

node.default['foo'] = {
  'bar' => {
    'baz' => 52,
    'thing' => 'stuff',
  },
  'bat' => {
   'things' => [5, 6],
  },
}

И некоторые атрибуты:

# Please don't ever do this in real code :)
node.role_default['foo']['bar']['baz'] = 55
node.force_default['foo']['bar']['baz'] = 66

И другие уровни приоритета:

node.normal['foo']['bar']['baz'] = 88
node.override['foo']['bar']['baz'] = 99

При полном присвоении:

node.default!['foo']['bar'] = {}

Значения по умолчанию для ролей и force остаются по умолчанию, плюс другие уровни приоритета:

node.attributes.combined_default['foo'] #=> {'bar' => {'baz' => 66}, 'bat'=>{'things'=>[5, 6]}}
node.attributes.normal['foo'] #=> {'bar' => {'baz' => 88}}
node.attributes.combined_override['foo'] #=> {'bar' => {'baz' => 99}}
node['foo']['bar'] #=> {'baz' => 99}

Если force_default! будет записано:

node.force_default!['foo']['bar'] = {}

разница будет:

node.attributes.combined_default['foo'] #=> {'bat'=>{'things'=>[5, 6]}, 'bar' => {}}
node.attributes.normal['foo'] #=> {'bar' => {'baz' => 88}}
node.attributes.combined_override['foo'] #=> {'bar' => {'baz' => 99}}
node['foo']['bar'] #=> {'baz' => 99}

О глубоком слиянии

Атрибуты обычно определяются в кулинарных книгах, рецептах, ролях и средах. Эти атрибуты сворачиваются до уровня узла во время выполнения Chef Infra Client. Рецепт может хранить значения атрибутов с помощью многоуровневого хэша или массива.

Например, группа атрибутов для веб-серверов может быть:

override_attributes(
  :apache => {
    :listen_ports => [ 80 ],
    :prefork => {
      :startservers => 20,
      :minspareservers => 20,
      :maxspareservers => 40
    }
  }
)

Но что, если все веб-серверы не одинаковы? Что, если некоторым веб-серверам требуется, чтобы один атрибут имел другое значение? Вы можете хранить эти настройки в двух местах, как в предыдущем примере, и как в следующем:

override_attributes(
  :apache => {
    :listen_ports => [ 80 ],
    :prefork => {
      :startservers => 30,
      :minspareservers => 20,
      :maxspareservers => 40
    }
  }
)

Но это не очень эффективно, особенно потому, что большинство из них идентичны. Возможности глубокого слияния Chef Infra Client позволяют создавать слои атрибутов через кулинарные книги, рецепты, роли и среды. Это позволяет повторно использовать атрибут на нескольких узлах, используя атрибуты по умолчанию, установленные на уровне кулинарной книги, но также предоставляет способ применения определенных атрибутов (с более высоким приоритетом атрибутов) только тогда, когда они должны быть применены.

Например, роль с именем baseline.rb:

name "baseline"
description "The most basic role for all configurations"
run_list "recipe[baseline]"

override_attributes(
  :apache => {
    :listen_ports => [ 80 ],
    :prefork => {
      :startservers => 20,
      :minspareservers => 20,
      :maxspareservers => 40
    }
  }
)

и затем роль с именем web.rb:

name 'web'
description 'Web server config'
run_list 'role[baseline]'

override_attributes(
  :apache => {
    :prefork => {
      :startservers => 30
    }
  }
)

Оба файла похожи, потому что они имеют одинаковую структуру. Когда значение атрибута является хэшем, эти данные объединяются. Когда значение атрибута является массивом, если уровни приоритета атрибутов одинаковы, то эти данные объединяются. Если уровни приоритета атрибутов в массиве разные, то эти данные заменяются. Для всех других типов значений (таких как строки, целые числа и т. д.) эти данные заменяются.

Например, web.rb ссылается на роль baseline.rb. Файл web.rb содержит значение только для одного атрибута: :startservers. Когда Chef Infra Client сравнивает эти атрибуты, функция глубокого слияния гарантирует, что :startservers (и его значение 30) будет применено к любому узлу, для которого должна применяться структура атрибута web.rb.

Этот подход позволит рецепту, такому как этот:

include_recipe 'apache2'
Chef::Log.info(node['apache']['prefork'].to_hash)

и роли, такой как эта:

run_list/web.json
{
  "run_list": [ "role[web]" ]
}

получить результаты, такие как эти:

[Tue, 16 Aug 2011 14:44:26 -0700] INFO:
         {
           "startservers"=>30,
           "minspareservers"=>20,
           "maxspareservers"=>40,
           "serverlimit"=>400,
           "maxclients"=>400,
           "maxrequestsperchild"=>10000
         }

Даже если файл web.rb не содержит атрибутов и значений для minspareservers, maxspareservers, serverlimit, maxclients, и maxrequestsperchild, возможности глубокого слияния взяли их.

В следующих разделах показано, как работает логика использования глубокого слияния для выполнения подстановок и добавлений атрибутов.

Подстановка

Следующие примеры показывают, как работает логика подстановки существующей строки с помощью хэша:

role_or_environment 1 { :x => '1', :y => '2' }
+
role_or_environment 2 { :y => '3' }
=
{ :x => '1', :y => '3' }

Для подстановки существующего булевого значения с помощью хэша:

role_or_environment 1 { :x => true, :y => false }
+
role_or_environment 2 { :y => true }
=
{ :x => true, :y => true }

Для подстановки массива с помощью хэша:

role_or_environment 1 [ '1', '2', '3' ]
+
role_or_environment 2 { :x => '1' , :y => '2' }
=
{ :x => '1', :y => '2' }

Когда элементы не могут быть объединены путем подстановки, исходные данные перезаписываются.

Добавление

Следующие примеры показывают, как работает логика добавления строки с помощью хэша:

role_or_environment 1 { :x => '1', :y => '2' }
+
role_or_environment 2 { :z => '3' }
=
{ :x => '1', :y => '2', :z => '3' }

Для добавления строки с помощью массива:

role_or_environment 1 [ '1', '2' ]
+
role_or_environment 2 [ '3' ]
=
[ '1', '2', '3' ]

Для добавления строки с помощью многоуровневого хэша:

role_or_environment 1 { :x => { :y => '2' } }
+
role_or_environment 2 { :x => { :z => '3' } }
=
{ :x => { :y => '2', :z => '3' } }

Для добавления строки с помощью многоуровневого массива:

role_or_environment 1 [ [ 1, 2 ] ]
+
role_or_environment 2 [ [ 3 ] ]
=
[ [ 1, 2 ], [ 3 ] ]

Ограничение сохранения атрибутов

Некоторые организации находят полезным контролировать данные атрибутов, хранящиеся на сервере Chef Infra, чтобы ограничить использование дискового пространства и процессорных ресурсов при обработке неиспользуемых атрибутов. Например, ваша организация может считать данные плагина Ohai Package полезными при написании кулинарных книг, но вам нет необходимости сохранять ~100k информации о пакетах для каждого запуска Chef Infra Client. Ограничивая данные, сохраняемые на сервере Chef Infra, они по-прежнему будут доступны на узле в кулинарных книгах, но не будут сохраняться на сервере Chef Infra, где они доступны в поисках.

Примечание

В Chef Infra Client 16.3 функции списка узлов-исключений (Blacklist) и списка узлов-допуска (Whitelist) были переименованы в список запрещенных (Blocklist) и список разрешенных (Allowlist). Для обратной совместимости старые значения конфигурации по-прежнему будут работать, но этот документ будет описывать имена Blocklist и Allowlist. Обратитесь к каждому разделу ниже, чтобы узнать соответствующие устаревшие значения конфигурации, если в вашей организации используются устаревшие клиенты.

Сопоставление устаревшей конфигурации:

  • automatic_attribute_blacklist -> blocked_automatic_attributes
  • default_attribute_blacklist -> blocked_default_attributes
  • normal_attribute_blacklist -> blocked_normal_attributes
  • override_attribute_blacklist -> blocked_override_attributes
  • automatic_attribute_whitelist -> allowed_automatic_attributes
  • default_attribute_whitelist -> allowed_default_attributes
  • normal_attribute_whitelist -> allowed_normal_attributes
  • override_attribute_whitelist -> allowed_override_attributes
  • enforce_path_sanity -> enforce_default_paths

Список запрещенных атрибутов

Предупреждение

При использовании настроек списка запрещенных атрибутов, любые атрибуты, определённые в списке запрещенных, не будут сохранены на сервере Chef Infra, а любые атрибуты, не определённые в списке запрещенных, будут сохранены. Каждый тип атрибутов должен быть запрещен независимо от других типов атрибутов. Например, если blocked_automatic_attributes определяет атрибуты, которые не будут сохранены, но blocked_normal_attributes, blocked_default_attributes, и blocked_override_attributes не определены, то все обычные атрибуты, атрибуты по умолчанию и переопределённые атрибуты будут сохранены, а также автоматические атрибуты, которые не были специально исключены с помощью запрета.

Атрибуты, которые не должны быть сохранены узлом, могут быть запрещены в файле client.rb. Список запрещенных — это массив ключей, которые указывают каждый атрибут для фильтрации.

Атрибуты запрещаются по типу атрибута, и каждый тип атрибутов запрещается независимо. Каждый тип атрибутов—automatic, default, normal, и override—может определять списки запрещенных, используя следующие настройки в файле client.rb:

Настройка Описание
blocked_automatic_attributes Хэш, который запрещает automatic атрибуты, предотвращая сохранение атрибутов в списке запрещенных. Например: ['network/interfaces/eth0']. Значение по умолчанию: nil, все атрибуты сохраняются. Если массив пустой, все атрибуты сохраняются.
blocked_default_attributes Хэш, который запрещает default атрибуты, предотвращая сохранение атрибутов в списке запрещенных. Например: ['filesystem/dev/disk0s2/size']. Значение по умолчанию: nil, все атрибуты сохраняются. Если массив пустой, все атрибуты сохраняются.
blocked_normal_attributes Хэш, который запрещает normal атрибуты, предотвращая сохранение атрибутов в списке запрещенных. Например: ['filesystem/dev/disk0s2/size']. Значение по умолчанию: nil, все атрибуты сохраняются. Если массив пустой, все атрибуты сохраняются.
blocked_override_attributes Хэш, который запрещает override атрибуты, предотвращая сохранение атрибутов в списке запрещенных. Например: ['map - autohome/size']. Значение по умолчанию: nil, все атрибуты сохраняются. Если массив пустой, все атрибуты сохраняются.

Запрещение атрибутов Ohai (автоматических)

Рекомендуется использовать blocked_automatic_attributes для запрета атрибутов, заполненных сбором информации о системе Ohai. Ohai собирает большое количество атрибутов, которые могут занимать значительное количество места на сервере Chef Infra. Многие из этих атрибутов могут быть очень ценными, а другие можно запретить без какого-либо влияния на доступные данные в поиске. Обычные, по умолчанию и переопределенные атрибуты обычно являются гораздо более важными атрибутами, используемыми в кулинарных книгах, и у них больше шансов вызвать проблемы, если их неправильно запретить.

Например, данные автоматических атрибутов, аналогичные:

{
  "filesystem" => {
    "/dev/disk0s2" => {
      "size" => "10mb"
    },
    "map - autohome" => {
      "size" => "10mb"
    }
  },
  "network" => {
    "interfaces" => {
      "eth0" => {...},
      "eth1" => {...},
    }
  }
}

Чтобы запретить filesystem атрибуты и разрешить сохранение других атрибутов, обновите файл client.rb:

blocked_automatic_attributes ['filesystem']

Когда список запрещенных определен, любой атрибут этого типа, который не указан в этом списке запрещенных атрибутов, будет сохранен. Таким образом, на основе предыдущего списка запрещенных атрибутов для автоматических атрибутов, атрибуты filesystem и map - autohome не будут сохранены, но атрибуты network будут.

Для атрибутов, содержащих слеши (/) внутри значения атрибута, например, атрибут filesystem '/dev/diskos2', используйте массив. Например:

blocked_automatic_attributes [['filesystem', '/dev/diskos2']]

Список разрешенных атрибутов

Предупреждение

При использовании настроек списка разрешенных атрибутов, будут сохранены только атрибуты, определенные в списке разрешенных, и любые атрибуты, которые не определены в списке разрешенных, не будут сохранены. Каждый тип атрибутов разрешен независимо от других типов атрибутов. Например, если automatic_attribute_allowlist определяет атрибуты для сохранения, но normal_attribute_allowlist, default_attribute_allowlist, и override_attribute_allowlist не определены, то все обычные атрибуты, атрибуты по умолчанию и переопределённые атрибуты будут сохранены, а также автоматические атрибуты, которые были специально включены в список разрешенных.

Атрибуты, которые должны быть сохранены узлом, могут быть разрешены в файле client.rb. Список разрешенных — это хэш ключей, указывающих каждый атрибут для сохранения.

Атрибуты разрешаются по типу атрибута, и каждый тип атрибутов разрешается независимо. Каждый тип атрибутов—automatic, default, normal, и override—может определять списки разрешенных, используя следующие настройки в файле client.rb:

Настройка Описание
allowed_automatic_attributes Хэш, который разрешает automatic атрибуты, предотвращая сохранение атрибутов не входящих в список разрешенных. Например: ['network/interfaces/eth0']. Значение по умолчанию: nil, все атрибуты сохраняются. Если хэш пустой, атрибуты не сохраняются.
allowed_default_attributes Хэш, который разрешает default атрибуты, предотвращая сохранение атрибутов не входящих в список разрешенных. Например: ['filesystem/dev/disk0s2/size']. Значение по умолчанию: nil, все атрибуты сохраняются. Если хэш пустой, атрибуты не сохраняются.
allowed_normal_attributes Хэш, который разрешает normal атрибуты, предотвращая сохранение атрибутов не входящих в список разрешенных. Например: ['filesystem/dev/disk0s2/size']. Значение по умолчанию: nil, все атрибуты сохраняются. Если хэш пустой, атрибуты не сохраняются.
allowed_override_attributes Хэш, который разрешает override атрибуты, предотвращая сохранение атрибутов не входящих в список разрешенных. Например: ['map - autohome/size']. Значение по умолчанию: nil, все атрибуты сохраняются. Если хэш пустой, атрибуты не сохраняются.

Разрешение атрибутов Ohai (автоматических)

Рекомендуется использовать allowed_automatic_attributes для разрешения конкретных атрибутов, заполненных сбором информации о системе Ohai. Ohai собирает большое количество атрибутов, которые могут занимать значительное количество места на сервере Chef Infra. Многие из этих атрибутов могут быть очень ценными, а другие можно пропустить без какого-либо влияния на доступные данные в поиске. Обычные, по умолчанию и переопределенные атрибуты обычно являются гораздо более важными атрибутами, используемыми в кулинарных книгах, и у них больше шансов вызвать проблемы, если их неправильно исключить из списка разрешенных.

Например, данные автоматических атрибутов, аналогичные:

{
  "filesystem" => {
    "/dev/disk0s2" => {
      "size" => "10mb"
    },
    "map - autohome" => {
      "size" => "10mb"
    }
  },
  "network" => {
    "interfaces" => {
      "eth0" => {...},
      "eth1" => {...},
    }
  }
}

Чтобы разрешить network атрибуты и предотвратить сохранение других атрибутов, обновите файл client.rb:

allowed_automatic_attributes ['network/interfaces/']

Когда список разрешенных определен, любой атрибут этого типа, который не указан в этом списке разрешенных атрибутов, не будет сохранен. Таким образом, на основе предыдущего списка разрешенных атрибутов для автоматических атрибутов, атрибуты filesystem и map - autohome не будут сохранены, но атрибуты network будут.

Оставьте значение пустым, чтобы предотвратить сохранение всех атрибутов этого типа атрибутов:

allowed_automatic_attributes []

Для атрибутов, содержащих слеши (/) внутри значения атрибута, например, атрибут filesystem '/dev/diskos2', используйте массив. Например:

allowed_automatic_attributes [['filesystem', '/dev/diskos2']]

© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/attributes/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API