Об атрибутах
Атрибут — это специфическая деталь узла. Атрибуты используются Chef Infra Client для понимания:
- Текущего состояния узла
- Состояния узла в конце предыдущего выполнения Chef Infra Client
- Желаемого состояния узла в конце текущего выполнения Chef Infra Client
Атрибуты определяются:
- Состоянием самого узла
- Атрибутами, переданными через JSON в командной строке
- Кулинарными книгами (в файлах атрибутов и/или рецептах)
- Ролями
- Средами
- Файлами политик
Во время каждого выполнения Chef Infra Client, Chef Infra Client строит список атрибутов, используя:
- Атрибуты, переданные через JSON в командной строке
- Данные об узле, собранные [Ohai].
- Объект узла, сохранённый на Chef Infra Server в конце предыдущего выполнения Chef Infra Client.
- Перестроенный объект узла из текущего выполнения Chef Infra Client, после обновления для изменений в кулинарных книгах (файлах атрибутов и/или рецептах), ролей и/или сред, а также обновлений для любых изменений в состоянии самого узла.
После перестроения объекта узла, все атрибуты сравниваются, а затем узел обновляется на основе приоритета атрибутов. В конце каждого выполнения Chef Infra Client объект узла, определяющий текущее состояние узла, загружается на Chef Infra Server для индексирования в поиске.
Итак, как Chef Infra Client определяет, какое значение должно быть применено? Продолжайте читать, чтобы узнать больше о работе с атрибутами, включая типы атрибутов, место сохранения атрибутов и то, как Chef Infra Client выбирает, какой атрибут применять.
Сохранение атрибутов
Все атрибуты, кроме обычных атрибутов, сбрасываются в начале выполнения Chef Infra Client. Атрибуты, заданные через chef-client -j с файлом JSON, имеют обычный приоритет и сохраняются между выполнениями Chef Infra Client. Chef Infra Client перестраивает эти атрибуты, используя автоматические атрибуты, собранные Ohai в начале каждого выполнения Chef Infra Client, а затем использует атрибуты по умолчанию и наложенные атрибуты, которые определены в кулинарных книгах, ролях, средах и файлах политик. Затем все атрибуты объединяются и применяются к узлу в соответствии с приоритетом атрибутов. Применённые к узлу атрибуты сохраняются на Chef Infra Server в качестве части объекта узла по окончании каждого выполнения Chef Infra Client.
Типы атрибутов
Chef Infra Client использует шесть типов атрибутов для определения значения, которое применяется к узлу во время выполнения Chef Infra Client. Кроме того, Chef Infra Client собирает значения атрибутов из до пяти источников. Сочетание типов и источников атрибутов составляет до 15 различных конкурирующих значений, доступных во время выполнения Chef Infra Client:
| Тип атрибута | Описание |
|---|---|
default |
Атрибут default автоматически сбрасывается в начале каждого выполнения Chef Infra Client и имеет самый низкий приоритет атрибута. Используйте атрибуты default в кулинарных книгах как можно чаще. |
force_default |
Используйте атрибут force_default для обеспечения того, что атрибут, определённый в кулинарной книге (файлом атрибутов или рецептом), имеет приоритет над атрибутом default, установленным ролью или средой. |
normal |
Атрибут normal — это настройка, которая сохраняется в объекте узла. Атрибут normal имеет более высокий приоритет атрибута, чем атрибут default. |
override |
Атрибут override автоматически сбрасывается в начале каждого выполнения Chef Infra Client и имеет более высокий приоритет, чем атрибуты default, force_default, и normal. Атрибут override чаще всего задаётся в рецепте, но может быть задан в файле атрибутов, для роли и/или для среды. Кулинарная книга должна быть написана так, чтобы использовать атрибуты override только по мере необходимости. |
force_override |
Используйте атрибут force_override для обеспечения того, что атрибут, определённый в кулинарной книге (файлом атрибутов или рецептом), имеет приоритет над атрибутом override, установленным ролью или средой. |
automatic |
Атрибут automatic содержит данные, идентифицированные Ohai в начале каждого выполнения Chef Infra Client. Атрибут automatic не может быть изменён и всегда имеет наивысший приоритет атрибута. |
Источники атрибутов
Атрибуты предоставляются Chef Infra Client из следующих источников:
- Файлы JSON, переданные через
chef-client -j - Узлы (собранные Ohai в начале каждого выполнения Chef Infra Client)
- Файлы атрибутов (в кулинарных книгах)
- Рецепты (в кулинарных книгах)
- Среды
- Роли
- Файлы политик
Примечания:
- Многие атрибуты хранятся в chef-repo для файлов политик, сред, ролей и кулинарных книг (файлов атрибутов и рецептов)
- Многие атрибуты собираются Ohai на каждом отдельном узле в начале каждого выполнения Chef Infra Client
- Атрибуты, хранящиеся в chef-repo, загружаются на Chef Infra Server с рабочей станции периодически
- Chef Infra Client загрузит объект узла с Chef Infra Server, а затем сбросит все атрибуты, кроме
normal. Объект узла будет содержать данные атрибутов из предыдущего выполнения Chef Infra Client, включая атрибуты, заданные с помощью файлов JSON через-j. - Chef Infra Client обновит кулинарные книги на узле (если необходимо), что обновит атрибуты, содержащиеся в файлах атрибутов и рецептах
- Chef Infra Client обновит данные ролей и сред (если необходимо)
- Chef Infra Client перестроит список атрибутов и применит приоритет атрибутов при конфигурировании узла
- Chef Infra Client отправит объект узла на Chef Infra Server в конце выполнения Chef Infra Client; обновлённый объект узла на Chef Infra Server будет затем проиндексирован для поиска и будет храниться до следующего выполнения Chef Infra Client
Автоматические (Ohai)
Автоматический атрибут — это определённая деталь узла, например, IP-адрес, имя хоста, список загруженных модулей ядра и т. д. Автоматические атрибуты обнаруживаются Ohai и затем используются Chef Infra Client для обеспечения их правильной обработки во время каждого выполнения Chef Infra Client. Наиболее часто используемые автоматические атрибуты:
| Атрибут | Описание |
|---|---|
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 Server и может быть получен с помощью подкоманды knife status. |
Ohai собирает список автоматических атрибутов в начале каждого выполнения Chef Infra Client. Этот список будет отличаться от организации к организации, от типа сервера и от платформы, на которой работают эти серверы. Все атрибуты, собранные Ohai, не могут быть изменены Chef Infra Client. Запустите команду 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 Client оценивает атрибуты в порядке, определённом списком задач, включая любые атрибуты, которые входят в список задач из-за зависимостей кулинарных книг.
Использование файлов атрибутов
Атрибут — это специфическая деталь узла, например, IP-адрес, имя хоста, список загруженных модулей ядра, версии доступных языков программирования и т. д. Атрибут может быть уникальным для конкретного узла или идентичным для каждого узла в организации. Атрибуты чаще всего задаются из кулинарной книги, с помощью команды knife или извлекаются Ohai с каждого узла перед каждым выполнением Chef Infra Client. Все атрибуты индексируются для поиска на Chef Infra Server. Хорошими кандидатами на атрибуты являются:
- любая кроссплатформенная абстракция для приложения, например, путь к файлу конфигурации
- значения по умолчанию для настраиваемых параметров, такие как объём памяти, выделенный процессу, или количество запускаемых рабочих процессов
- любая информация, которая может потребоваться сохранить в данных узла между запусками Chef Infra Client
В целом, приоритет атрибутов настроен таким образом, чтобы кулинарии и роли могли определять значения по умолчанию для атрибутов, обычные атрибуты определяют значения, специфичные для узла, а атрибуты переопределения принудительно устанавливают определённое значение, даже если узел уже указал это значение.
Один подход заключается в установке атрибутов на одном уровне приоритета, задавая атрибуты в файлах атрибутов кулинарии, а затем задавая те же атрибуты по умолчанию (но с разными значениями) с помощью роли. Атрибуты, заданные в роли, будут глубоко слиты поверх атрибутов из файла атрибутов, а атрибуты, заданные ролью, будут иметь приоритет над атрибутами, указанными в файлах атрибутов кулинарии.
Другой (гораздо менее распространённый) подход заключается в установке значения только в том случае, если атрибут не имеет значения. Это можно сделать, используя варианты _unless методов приоритета атрибутов:
default_unlessnormal_unless
Используйте варианты _unless с осторожностью (и только в необходимых случаях), так как при их использовании атрибуты, применяемые к узлам, могут начать расходиться со значениями в кулинариях по мере их обновления. Этот подход может привести к ситуациям, когда два в остальном идентичных узла получают немного разные конфигурации, а отладка может стать затруднительной.
Методы файлов
Используйте следующие методы в файле атрибутов для кулинарии или в рецепте. Эти методы соответствуют типу атрибута с тем же именем:
overridedefaultnormal_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 применяет эти новые настройки и значения во время выполнения Chef Infra Client.
Атрибут роли может быть только атрибутом по умолчанию или атрибутом переопределения. Атрибут роли не может быть обычным атрибутом. Используйте методы default_attribute и override_attribute в файле Ruby DSL или хэши default_attributes и override_attributes в файле данных JSON.
Среды
Среда — это способ сопоставления реального рабочего процесса организации с тем, что можно настроить и управлять при использовании Chef Infra. Это сопоставление выполняется путём настройки атрибутов и привязки кулинарий на уровне среды. С помощью сред вы можете изменять конфигурации кулинарий в зависимости от назначения системы. Например, назначив разные среды подготовки и производства, вы можете определить правильный URL-адрес сервера базы данных для каждой среды. Среды также позволяют организациям с уверенностью переносить новые релизы кулинарий из среды подготовки в производственную, пройдя релизы через тестовые среды перед выходом в производство.
Атрибуты могут быть определены в среде и затем использованы для переопределения атрибутов по умолчанию в кулинарии. При применении среды во время выполнения Chef Infra Client атрибуты среды сравниваются с атрибутами, уже присутствующими на узле. Когда атрибуты среды имеют приоритет над атрибутами по умолчанию, Chef Infra Client применяет эти новые параметры и значения во время выполнения Chef Infra Client.
Атрибуты среды могут быть установлены на уровне атрибута default или уровня атрибута override.
Порядок приоритета атрибутов
Атрибуты всегда применяются Chef Infra Client в следующем порядке:
- Атрибут
defaultв файле атрибутов кулинарии - Атрибут
defaultв рецепте - Атрибут
defaultв среде - Атрибут
defaultв роли - Атрибут
force_defaultв файле атрибутов кулинарии - Атрибут
force_defaultв рецепте - Атрибут
normalв файле JSON, переданном черезchef-client -j - Атрибут
normalв файле атрибутов кулинарии - Атрибут
normalв рецепте - Атрибут
overrideв файле атрибутов кулинарии - Атрибут
overrideв рецепте - Атрибут
overrideв роли - Атрибут
overrideв среде - Атрибут
force_overrideв файле атрибутов кулинарии - Атрибут
force_overrideв рецепте - Атрибут
automatic, определённый Ohai в начале выполнения Chef Infra Client
где последний атрибут в списке — тот, который применяется к узлу.
Примечание
Порядок приоритета атрибутов для ролей и сред меняется для атрибутов default и override. Порядок приоритета для атрибутов default — среда, затем роль. Порядок приоритета для атрибутов override — роль, затем среда. Применение атрибутов среды override после атрибутов роли override позволяет использовать одну и ту же роль в нескольких средах, но обеспечивает возможность устанавливать значения, специфичные для каждой среды (по мере необходимости). Например, роль сервера приложений может существовать во всех средах, но одна среда может использовать сервер базы данных, отличающийся от других сред.
Порядок приоритета атрибутов, рассматриваемый с той же точки зрения, что и на диаграмме обзора, где номера на диаграмме соответствуют порядку приоритета атрибутов:
Порядок приоритета атрибутов, представленный в виде таблицы:
Примеры
Следующие примеры приведены от низшего к высшему приоритету.
Атрибут по умолчанию в /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. При сравнении этих атрибутов функция глубокого объединения гарантирует, что :startservers (и его значение 30) будут применяться к любому узлу, для которого должна применяться структура атрибута web.rb.
Этот подход позволит рецепту такого вида:
include_recipe 'apache2'
Chef::Log.info(node['apache']['prefork'].to_hash)
и роли run_list такого вида:
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, чтобы ограничить использование дисков и процессора при обработке неиспользуемых атрибутов. Например, ваша организация может обнаружить, что данные из плагина Ohai Package полезны при написании кулинарных книг, но вам нет необходимости сохранять ~100 кБ информации о пакетах для каждого выполнения Chef Infra Client. Ограничив данные, сохраняемые на сервере Chef, они по-прежнему будут доступны на узле внутри кулинарных книг, но не будут сохранены на сервере Chef, где они доступны в поисках.
Примечание
В Chef Infra Client 16.3 функции списка узлов по исключению и включению были переименованы в список узлов по блокированию и список узлов по разрешению. Для обратной совместимости старые значения конфигурации продолжат работать, но в этом документе будут описаны названия «Список узлов по блокированию» и «Список узлов по разрешению». Обратитесь к каждому разделу ниже для соответствующих устаревших значений конфигурации, если вы используете устаревшие клиенты в своей организации.
Сопоставление устаревшей конфигурации:
- 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