Ресурс cookbook_file
Эта страница сгенерирована из исходного кода Chef. Чтобы предложить изменения, отредактируйте файл cookbook_file.rb и отправьте запрос на pull в репозиторий Chef.
Страница справочника по ресурсам
Используйте ресурс cookbook_file для передачи файлов из подкаталога COOKBOOK_NAME/files/ в указанный путь на хосте, на котором запущен клиент Chef Infra. Файл выбирается в соответствии с его спецификой, что позволяет использовать разные исходные файлы в зависимости от имени хоста, платформы хоста (операционной системы, дистрибутива и т. д.) или версии платформы. Файлы, расположенные в подкаталоге COOKBOOK_NAME/files/default, могут использоваться на любой платформе.
Во время выполнения клиента Chef Infra вычисляется контрольная сумма каждого локального файла, а затем сравнивается с контрольной суммой того же файла в его текущем состоянии в книге рецептов на сервере Chef Infra. Файл не передается, если контрольные суммы совпадают. Передаются только файлы, требующие обновления, с сервера Chef Infra на узел.
Синтаксис
Блок ресурса cookbook_file управляет файлами, используя файлы, существующие в каталоге /files книги рецептов. Например, чтобы записать домашнюю страницу веб-сайта Apache:
cookbook_file '/var/www/customers/public_html/index.php' do
source 'index.php'
owner 'web_admin'
group 'web_admin'
mode '0755'
action :create
end
где:
-
'/var/www/customers/public_html/index.php'— путь к файлу, который нужно создать -
'index.php'— файл в каталоге/filesв книге рецептов, который используется для создания этого файла (содержимое файла в книге рецептов станет содержимым файла на узле) -
owner,groupиmodeопределяют права доступа
Полный синтаксис для всех доступных свойств ресурса cookbook_file:
cookbook_file 'name' do
atomic_update true, false
backup Integer, false # default value: 5
cookbook String
force_unlink true, false # default value: false
group String, Integer
inherits true, false
manage_symlink_source true, false
mode String, Integer
owner String, Integer
path String # default value: 'name' unless specified
rights Hash
source String, Array
verify String, Block
action Symbol # defaults to :create if not specified
endгде:
-
cookbook_file— ресурс. -
name— имя, данное блоку ресурса. -
actionопределяет, какие действия выполнит клиент Chef Infra для приведения узла в желаемое состояние. -
atomic_update,backup,cookbook,force_unlink,group,inherits,manage_symlink_source,mode,owner,path,rights,sourceиverify— свойства этого ресурса, с указанным типом Ruby. См. раздел «Свойства» ниже для получения дополнительной информации о всех свойствах, которые можно использовать с этим ресурсом.
Действия
Ресурс cookbook_file имеет следующие действия:
:create- По умолчанию. Создать файл. Если файл уже существует (но не совпадает), обновить этот файл.
:create_if_missing- Создать файл только если он не существует. Если файл существует, ничего не происходит.
:delete- Удалить файл.
:nothing- Этот блок ресурса не выполняет никаких действий, пока не получит уведомление от другого ресурса о необходимости принять меры. После получения уведомления этот блок ресурса либо выполняется немедленно, либо помещается в очередь для выполнения в конце выполнения клиента Chef Infra.
:touch- Коснитесь файла. Это обновляет время доступа (atime) и время изменения файла (mtime). (Это действие можно использовать с этим ресурсом, но обычно оно используется только с ресурсом file.)
Свойства
Ресурс cookbook_file имеет следующие свойства:
atomic_update-
Тип Ruby: true, false | Значение по умолчанию:
False if modifying /etc/hosts, /etc/hostname, or /etc/resolv.conf within Docker containers. Otherwise default to the client.rb 'file_atomic_update' config value.Выполнять атомарные обновления файлов на основе каждого ресурса. Установите значение true для атомарных обновлений файлов. Установите значение false для неатомарных обновлений файлов. Эта настройка переопределяет
file_atomic_update, которая является глобальной настройкой, найденной в файлеclient.rb.
backup-
Тип Ruby: Integer, false | Значение по умолчанию:
5Количество резервных копий, которые необходимо хранить в
/var/chef/backup(для платформ на основе UNIX и Linux) илиC:/chef/backup(для платформы Microsoft Windows). Установите значениеfalse, чтобы предотвратить сохранение резервных копий.
cookbook-
Тип Ruby: String | Значение по умолчанию:
The current cookbook nameКнига рецептов, в которой находится файл (если он не находится в текущей книге рецептов).
force_unlink-
Тип Ruby: true, false | Значение по умолчанию:
falseКак клиент Chef Infra обрабатывает определенные ситуации, когда целевой файл оказывается не файлом. Например, когда целевой файл на самом деле является символической ссылкой. Установите значение
trueдля удаления клиентом Chef Infra нефайлового целевого объекта и его замены указанным файлом. Установите значениеfalseдля того, чтобы клиент Chef Infra выдал ошибку.
group-
Тип Ruby: Integer, String
Строка или идентификатор, который определяет владельца группы по имени группы или SID, включая полные имена групп, такие как
domain\groupилиgroup@domain. Если это значение не указано, существующие группы остаются неизменными, а для новых назначений групп используется группа по умолчаниюPOSIX(если доступна).
inherits-
Тип Ruby: true, false | Значение по умолчанию:
trueТолько Microsoft Windows. Наследует ли файл права от своего родительского каталога.
manage_symlink_source-
Тип Ruby: true, false | Значение по умолчанию:
true(с предупреждением)
Измените поведение ресурса файла, если он указывает на символическую ссылку. Когда это значение установлено в
true, клиент Chef Infra будет управлять правами доступа символической ссылки или заменит символическую ссылку обычным файлом, если у ресурса есть содержимое. Когда это значение установлено вfalse, Chef будет следовать символической ссылке и будет управлять правами доступа и содержимым целевого файла символической ссылки.Поведение по умолчанию —
true, но выводится предупреждение о том, что значение по умолчанию будет изменено наfalseв будущей версии; явное задание этого значения вtrueилиfalseподавляет это предупреждение.
mode-
Тип Ruby: Integer, String
Если
modeне указан и файл уже существует, используется существующий режим файла. Еслиmodeне указан, файл не существует и указано действие:create, клиент Chef Infra предполагает значение маски'0777'и затем применяет umask для системы, на которой должен быть создан файл, к значениюmask. Например, если umask в системе равен'022', клиент Chef Infra использует значение по умолчанию'0755'.Поведение отличается в зависимости от платформы.
Системы на основе UNIX и Linux: строка из 3-5 символов, которая определяет восьмеричный режим, передаваемый в chmod. Например:
'755','0755'или00755. Если значение указано как строка в кавычках, оно работает точно так же, как если бы была передана командаchmod. Если значение указано как целое число, добавьте нуль (0) перед значением, чтобы гарантировать, что оно будет интерпретироваться как восьмеричное число. Например, чтобы назначить права на чтение, запись и выполнение для всех пользователей, используйте'0777'или'777'; для тех же прав, плюс липкий бит, используйте01777или'1777'.Microsoft Windows: строка из 3-5 символов, которая определяет восьмеричный режим, преобразуемый в права доступа для безопасности Microsoft Windows. Например:
'755','0755'или00755. Допускаются значения до'0777'(без липких битов), и они имеют то же значение в Microsoft Windows, что и в UNIX, где4равноGENERIC_READ,2равноGENERIC_WRITE, а1равноGENERIC_EXECUTE. Это свойство не может быть использовано для установки:full_control. Это свойство не оказывает никакого влияния, если не указано, но когда оно иrightsуказаны оба, эффекты являются кумулятивными.
owner-
Тип Ruby: Integer, String
Строка или идентификатор, который определяет владельца группы по имени пользователя или SID, включая полные имена пользователей, такие как
domain\userилиuser@domain. Если это значение не указано, существующие владельцы остаются неизменными, а для новых назначений владельцев используется текущий пользователь (при необходимости).
path-
Тип Ruby: String
Путь к месту назначения, в котором должен быть создан файл. Например:
file.txt.Microsoft Windows: путь, начинающийся с прямой косой черты (
/), будет указывать на корень текущего рабочего каталога процесса клиента Chef Infra. Этот путь может варьироваться от системы к системе. Поэтому использование пути, начинающегося с прямой косой черты (/), не рекомендуется.
rights-
Тип Ruby: Integer, String
Только Microsoft Windows. Права доступа для пользователей и групп в среде Microsoft Windows. Например:
rights <permissions>, <principal>, <options>, где<permissions>указывает права, предоставленные участнику,<principal>— имя группы или пользователя, а<options>— это Hash с одним (или несколькими) расширенными параметрами прав.
source-
Тип Ruby: String, Array | Значение по умолчанию:
The resource block's nameИмя файла в
COOKBOOK_NAME/files/defaultили путь к файлу, расположенному вCOOKBOOK_NAME/files. Путь должен включать имя файла и его расширение. Это можно использовать для распространения определенных файлов в зависимости от используемой платформы — см. Специфика файла для получения дополнительной информации.
verify-
Тип Ruby: Строка, Блок
Блок или строка, возвращающие
trueилиfalse. Строка, когдаtrueвыполняется как системная команда.Блок — произвольный код Ruby, определенный внутри блока ресурсов с использованием свойства
verify. Когда блокtrue, Chef Infra Client будет продолжать обновлять файл как требуется.Например, это должно вернуть
true:cookbook_file '/tmp/baz' do verify { 1 == 1 } endЭто должно вернуть
true:cookbook_file '/etc/nginx.conf' do verify 'nginx -t -c %{path}' endЭто должно вернуть
true:cookbook_file '/tmp/bar' do verify { 1 == 1} endА это должно вернуть
true:cookbook_file '/tmp/foo' do verify do |path| true end endВ то время как это должно вернуть
false:cookbook_file '/tmp/turtle' do verify '/usr/bin/false' endЕсли строка или блок возвращают
false, запуск Chef Infra Client прекратится, и будет возвращено сообщение об ошибке.
Атомарные обновления файлов
Атомарные обновления используются с ресурсами типа file, чтобы гарантировать, что обновления файлов можно выполнить при обновлении двоичного файла или при недостатке места на диске.
Атомарные обновления включены по умолчанию. Их можно управлять глобально, используя настройку file_atomic_update в файле client.rb. Их можно управлять на уровне каждого ресурса, используя свойство atomic_update, доступное для ресурсов cookbook_file, file, remote_file и template.
Примечание
На некоторых платформах после перемещения файла Chef Infra Client может изменить разрешения файла для поддержки функций, специфичных для этих платформ. На платформах с включенным SELinux Chef Infra Client исправит контексты безопасности после перемещения файла в нужное место, выполнив команду restorecon. На платформе Microsoft Windows Chef Infra Client создаст файлы таким образом, чтобы наследование ACL работало как ожидается.
Безопасность файлов в Windows
Для поддержки безопасности Microsoft Windows ресурсы template, file, remote_file, cookbook_file, directory и remote_directory поддерживают использование наследования и списков управления доступом (ACL) в рецептах. Списки управления доступом (ACL)Свойство rights может использоваться в рецепте для управления списками управления доступом (ACL), которые позволяют предоставлять разрешения нескольким пользователям и группам. Свойство rights может использоваться столько раз, сколько необходимо; Chef Infra Client применит их к файлу или каталогу по необходимости. Синтаксис свойства rights следующий:
rights permission, principal, option_type => value
где
permission-
Используется для указания прав, предоставляемых
principal. Возможные значения::read,:write,read_execute,:modifyи:full_control.Эти разрешения суммируются. Если указано
:write, то это включает:read. Если указано:full_control, то это включает как:write, так и:read.(Для тех, кто знаком с API Microsoft Windows:
:readсоответствуетGENERIC_READ;:writeсоответствуетGENERIC_WRITE;:read_executeсоответствуетGENERIC_READиGENERIC_EXECUTE;:modifyсоответствуетGENERIC_WRITE,GENERIC_READ,GENERIC_EXECUTE, иDELETE;:full_controlсоответствуетGENERIC_ALL, что позволяет пользователю изменять владельца и другие метаданные файла.) principalИспользуется для указания группы или пользователя. Субъект может быть указан либо по имени, либо по SID. При использовании имени это совпадает с тем, что вводится в поле входа Microsoft Windows, например,
user_name,domain\user_name, илиuser_name@fully_qualified_domain_name. При использовании SID вы можете использовать либо стандартное строковое представление SID (S-R-I-S-S), либо одно из констант строк SDDL. Chef Infra Client не нужно знать, является ли субъект пользователем или группой.option_type-
Хэш, содержащий расширенные параметры прав. Например, права на каталог, которые применяются только к первому уровню дочерних элементов, могут выглядеть так:
rights :write, 'domain\group_name', :one_level_deep => true. Возможные типы параметров:Тип параметра Описание :applies_to_childrenУказывает, как права применяются к дочерним элементам. Возможные значения: trueдля наследования как дочерних каталогов, так и файлов;falseдля отказа от наследования любых дочерних каталогов или файлов;:containers_onlyдля наследования только дочерних каталогов (а не файлов);:objects_onlyдля рекурсивного наследования файлов (а не дочерних каталогов).:applies_to_selfУказывает, применяется ли разрешение к родительскому каталогу. Возможные значения: trueдля применения к родительскому каталогу или файлу и его дочерним элементам;falseдля применения только к дочерним каталогам и файлам.:one_level_deepУказывает глубину, до которой будут применяться разрешения. Возможные значения: trueдля применения только к первому уровню дочерних элементов;falseдля применения ко всем дочерним элементам.
Например:
resource 'x.txt' do
rights :read, 'S-1-1-0'
rights :write, 'domain\group'
rights :full_control, 'group_name_or_user_name'
rights :full_control, 'user_name', applies_to_children: true
end
или:
rights :read, %w(Administrators Everyone)
rights :full_control, 'Users', applies_to_children: true
rights :write, 'Sally', applies_to_children: :containers_only, applies_to_self: false, one_level_deep: true
Некоторые другие важные моменты при использовании атрибута rights:
- Остаются только унаследованные права. Все существующие явные права на объект удаляются и заменяются.
- Если права не указаны, ничего не изменится. Chef Infra Client не очищает права на файл или каталог, если права не указаны.
- Изменение унаследованных прав может быть дорогостоящим. Microsoft Windows будет рекурсивно распространять права на все дочерние элементы из-за наследования. Это нормальный аспект Microsoft Windows, поэтому подумайте о частоте необходимости такого действия и примите меры по управлению такими действиями, если производительность является основным фактором.
Используйте свойство deny_rights для отказа конкретным пользователям в конкретных правах. Порядок не зависит от использования свойства rights. Например, не имеет значения, помещены ли права всем перед или после deny_rights :read, ['Julian', 'Lewis'], оба Юлия и Левис не смогут читать документ. Например:
resource 'x.txt' do
rights :read, 'Everyone'
rights :write, 'domain\group'
rights :full_control, 'group_name_or_user_name'
rights :full_control, 'user_name', applies_to_children: true
deny_rights :read, %w(Julian Lewis)
end
или:
deny_rights :full_control, ['Sally']
По умолчанию файл или каталог наследуют права из родительского каталога. В большинстве случаев это предпочтительное поведение, но иногда может потребоваться принять меры для более конкретного контроля прав. Свойство inherits можно использовать для указания Chef Infra Client, чтобы он применял (или не применял) унаследованные права из родительского каталога.
Например, следующий пример определяет права для каталога:
directory 'C:\mordor' do
rights :read, 'MORDOR\Minions'
rights :full_control, 'MORDOR\Sauron'
end
а затем следующий пример показывает, как использовать наследование, чтобы запретить доступ к дочернему каталогу:
directory 'C:\mordor\mount_doom' do
rights :full_control, 'MORDOR\Sauron'
inherits false # Sauron is the only person who should have any sort of access
end
Если вместо разрешения deny_rights будет использоваться другое, что-то могло бы пройти незамеченным, если бы не было запрещено всем пользователям и группам.
Еще один пример показывает, как определить права для каталога:
directory 'C:\mordor' do
rights :read, 'MORDOR\Minions'
rights :full_control, 'MORDOR\Sauron'
rights :write, 'SHIRE\Frodo' # Who put that there I didn't put that there
end
но затем не использовать свойство inherits для отказа от этих прав в дочернем каталоге:
directory 'C:\mordor\mount_doom' do
deny_rights :read, 'MORDOR\Minions' # Oops, not specific enough
end
Поскольку свойство inherits не указано, Chef Infra Client по умолчанию установит его в значение true, что обеспечит сохранение первоначальных настроек безопасности существующих файлов.
Общие функциональные возможности ресурсов
Ресурсы Chef включают общие свойства, уведомления и защитные механизмы ресурсов.
Общие свойства
Следующие свойства общие для всех ресурсов:
compile_time-
Тип Ruby: true, false | Значение по умолчанию:
falseУправляет фазой, в которой ресурс выполняется на узле. Установите в значение true, чтобы запустить его во время построения коллекции ресурсов (фаза
compile phase). Установите в значение false, чтобы запустить его во время конфигурации узла Chef Infra Client (фазаconverge phase). ignore_failure-
Тип Ruby: true, false, :quiet | Значение по умолчанию:
falseПродолжать выполнение рецепта, если ресурс завершится неудачно по любой причине.
:quietне отобразит полный стек вызовов, и рецепт будет продолжать работу, если ресурс завершится неудачно. retries-
Тип Ruby: Целое число | Значение по умолчанию:
0Количество попыток перехватить исключения и повторить ресурс.
retry_delay-
Тип Ruby: Целое число | Значение по умолчанию:
2Задержка повтора (в секундах).
sensitive-
Тип Ruby: true, false | Значение по умолчанию:
falseОбеспечить, чтобы конфиденциальные данные ресурса не регистрировались Chef InfraClient.
Уведомления
notifies-
Тип Ruby: Символ, 'Chef::Resource[String]'
Ресурс может уведомить другой ресурс о выполнении действия при изменении его состояния. Укажите
'resource[name]', действие, которое должен выполнить ресурс:action, и:timerдля этого действия. Ресурс может уведомить несколько ресурсов; для каждого уведомляемого ресурса используйте операторnotifies.Если указанный ресурс не существует, возникает ошибка. В отличие от
subscribes, он не завершится неудачей, если исходный ресурс не найден.
Таймеры указывают момент во время выполнения Chef Infra Client, в который выполняется уведомление. Доступны следующие таймеры:
:beforeУказывает, что действие над уведомлённым ресурсом должно быть выполнено до обработки блока ресурса, в котором расположено уведомление.
:delayedПо умолчанию. Указывает, что уведомление должно быть помещено в очередь и выполнено в конце выполнения Chef Infra Client.
-
:immediate,:immediately Указывает, что уведомление должно быть выполнено немедленно для каждого уведомлённого ресурса.
Синтаксис для notifies:
notifies :action, 'resource[name]', :timer
subscribesТип в Ruby: Символ, 'Chef::Resource[String]'
Ресурс может прослушивать другой ресурс и затем выполнять действие, если состояние прослушиваемого ресурса изменяется. Укажите 'resource[name]', действие :action, и затем :timer для этого действия.
Обратите внимание, что subscribes не применяет указанное действие к ресурсу, который он прослушивает — например:
file '/etc/nginx/ssl/example.crt' do
mode '0600'
owner 'root'
end
service 'nginx' do
subscribes :reload, 'file[/etc/nginx/ssl/example.crt]', :immediately
end
В этом случае свойство subscribes перезагружает службу nginx всякий раз, когда файл сертификата, расположенный по адресу /etc/nginx/ssl/example.crt, обновляется. subscribes не вносит никаких изменений в сам файл сертификата, он лишь прослушивает изменения в файле и выполняет действие :reload для своего ресурса (в данном примере nginx) при обнаружении изменений.
Если другой ресурс не существует, подписка не вызовет ошибку. В отличие от более жёсткой семантики notifies, которая вызовет ошибку, если другой ресурс не существует.
Таймер указывает момент во время выполнения Chef Infra Client, когда выполняется уведомление. Доступны следующие таймеры:
:beforeУказывает, что действие над уведомлённым ресурсом должно быть выполнено до обработки блока ресурса, в котором расположено уведомление.
:delayedПо умолчанию. Указывает, что уведомление должно быть помещено в очередь и выполнено в конце выполнения Chef Infra Client.
-
:immediate,:immediately Указывает, что уведомление должно быть выполнено немедленно для каждого уведомлённого ресурса.
Синтаксис для subscribes:
subscribes :action, 'resource[name]', :timer
Блокирующие условия
Свойство блокирующего условия может использоваться для оценки состояния узла во время фазы выполнения Chef Infra Client. Основываясь на результатах этой оценки, свойство блокирующего условия затем используется для указания Chef Infra Client, следует ли ему продолжать выполнение ресурса. Свойство блокирующего условия принимает либо строковое значение, либо значение Ruby-блока:
- Строка выполняется как команда оболочки. Если команда возвращает
0, блокирующее условие применяется. Если команда возвращает любое другое значение, то свойство блокирующего условия не применяется. Строковые блокирующие условия в powershell_script запускают команды Windows PowerShell и могут возвращатьtrueпомимо0. - Блок выполняется как Ruby-код, который должен возвращать либо
true, либоfalse. Если блок возвращаетtrue, свойство блокирующего условия применяется. Если блок возвращаетfalse, свойство блокирующего условия не применяется.
Свойство блокирующего условия полезно для обеспечения идемпотентности ресурса, позволяя этому ресурсу проверять желаемое состояние во время его выполнения и, если желаемое состояние присутствует, не выполнять никаких действий Chef Infra Client.
СвойстваСледующие свойства могут использоваться для определения блокирующего условия, которое оценивается во время фазы выполнения Chef Infra Client:
not_ifПредотвращает выполнение ресурса, когда условие возвращает
true.only_ifРазрешает выполнение ресурса только в том случае, если условие возвращает
true.
Специфика файлов кулинарной книги
Кулинарная книга часто разрабатывается для работы на нескольких платформах и часто должна распространять определённый файл на определённую платформу. Кулинарную книгу можно разработать для поддержки распространения файлов по платформам, гарантируя при этом, что правильный файл оказывается на каждой системе.
Шаблон для специфичности файлов зависит от двух вещей: пути поиска и атрибута источника. Используется первый сопоставленный шаблон:
- /host-$fqdn/$source
- /$platform-$platform_version/$source
- /$platform/$source
- /default/$source
- /$source
Используйте массив с атрибутом source для определения явного пути поиска. Например:
file '/conf.py' do
source ['#{node.chef_environment}.py', 'conf.py']
end
Следующий пример эмулирует весь шаблон специфичности файлов, определив его как явный путь:
file '/conf.py' do
source %W(
host-#{node['fqdn']}/conf.py
#{node['platform']}-#{node['platform_version']}/conf.py
#{node['platform']}/conf.py
default/conf.py
)
end
Кулинарная книга может иметь структуру каталогов /files вот так:
files/
host-foo.example.com
ubuntu-20.04
ubuntu-20
ubuntu
redhat-8.2
redhat-7.8
...
default
и ресурс, который выглядит примерно так:
cookbook_file '/usr/local/bin/apache2_module_conf_generate.pl' do
source 'apache2_module_conf_generate.pl'
mode '0755'
owner 'root'
group 'root'
end
Этот ресурс сопоставляется в том же порядке, что и структура каталогов /files. Для узла, работающего под Ubuntu 16.04, вторым элементом будет соответствующий элемент и местоположение, в которое будет распространяться файл, указанный в ресурсе cookbook_file:
host-foo.example.com/apache2_module_conf_generate.pl
ubuntu-20.04/apache2_module_conf_generate.pl
ubuntu-20/apache2_module_conf_generate.pl
ubuntu/apache2_module_conf_generate.pl
default/apache2_module_conf_generate.pl
Если файл apache2_module_conf_generate.pl был расположен в каталоге кулинарной книги по адресу files/host-foo.example.com/, указанный файл(ы) будут скопированы только на компьютер с доменным именем foo.example.com.
Запись узла
Названия папок в каталогах кулинарных книг должны буквально совпадать с записью узла, используемой для сопоставления специфичности файлов. Например, если узел называется foo.example.com, папка должна называться host-foo.example.com.
Примеры
В следующих примерах показаны различные подходы к использованию ресурса cookbook_file в рецептах:
Передача файла
cookbook_file 'file.txt' do
mode '0755'
end
Обработка ресурсов cookbook_file и package в одном рецепте
Когда ресурс cookbook_file и ресурс package вызываются из одного рецепта, используйте атрибут flush_cache для сброса кэша Yum в памяти, а затем используйте репозиторий немедленно, чтобы убедиться, что установлен правильный пакет:
cookbook_file '/etc/yum.repos.d/custom.repo' do
source 'custom'
mode '0755'
end
package 'only-in-custom-repo' do
action :install
flush_cache [ :before ]
end
Установка репозиториев из файла, запуск команды и принудительная перезагрузка внутреннего кэша
Следующий пример показывает, как устанавливать новые репозитории Yum из файла, где установка репозитория запускает создание кэша Yum, который принуждает к перезагрузке внутреннего кэша для Chef Infra Client:
execute 'create-yum-cache' do
command 'yum -q makecache'
action :nothing
end
ruby_block 'reload-internal-yum-cache' do
block do
Chef::Provider::Package::Yum::YumCache.instance.reload
end
action :nothing
end
cookbook_file '/etc/yum.repos.d/custom.repo' do
source 'custom'
mode '0755'
notifies :run, 'execute[create-yum-cache]', :immediately
notifies :create, 'ruby_block[reload-internal-yum-cache]', :immediately
end
Использование оператора case
Следующий пример показывает, как оператор case может использоваться для обработки ситуации, когда приложение необходимо установить на нескольких платформах, но каталоги установки отличаются в зависимости от платформы:
cookbook_file 'application.pm' do
path case node['platform']
when 'centos','redhat'
'/usr/lib/version/1.2.3/dir/application.pm'
when 'arch'
'/usr/share/version/core_version/dir/application.pm'
else
'/etc/version/dir/application.pm'
end
source "application-#{node['languages']['perl']['version']}.pm"
owner 'root'
group 'root'
mode '0755'
end
Управление файлами с точкой
Следующий пример показывает использование ресурсов directory и cookbook_file для управления файлами с точкой. Файлы с точкой определяются структурой данных JSON, похожей на:
"files": {
".zshrc": {
"mode": '0755',
"source": "dot-zshrc"
},
".bashrc": {
"mode": '0755',
"source": "dot-bashrc"
},
".bash_profile": {
"mode": '0755',
"source": "dot-bash_profile"
},
}
а затем следующие ресурсы управляют файлами с точкой:
if u.has_key?('files')
u['files'].each do |filename, file_data|
directory "#{home_dir}/#{File.dirname(filename)}" do
recursive true
mode '0755'
end if file_data['subdir']
cookbook_file "#{home_dir}/#{filename}" do
source "#{u['id']}/#{file_data['source']}"
owner 'u['id']'
group 'group_id'
mode 'file_data['mode']'
ignore_failure true
backup 0
end
end
© 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/resources/cookbook_file/