Ресурс каталога
Эта страница сгенерирована из исходного кода Chef Infra Client. Чтобы предложить изменение, отредактируйте файл directory.rb и отправьте запрос на вытягивание в репозиторий Chef Infra Client.
Используйте ресурс каталога для управления каталогом, представляющим собой иерархию папок, содержащую всю информацию, хранящуюся на компьютере. Корневой каталог — это верхний уровень, под которым организована остальная часть каталога. Ресурс каталога использует свойство name для указания пути к расположению в каталоге. Как правило, требуется разрешение на доступ к этому расположению в каталоге.
Синтаксис
Блок ресурса каталога объявляет каталог и необходимые разрешения на этом каталоге. Например:
directory '/etc/apache2' do
owner 'root'
group 'root'
mode '0755'
action :create
end
где:
-
'/etc/apache2'определяет каталог -
owner,group, иmodeопределяют разрешения
Полный синтаксис всех свойств, доступных для ресурса каталога:
directory 'name' do
group String, Integer
inherits true, false
mode String, Integer
owner String, Integer
path String # defaults to 'name' if not specified
recursive true, false
rights Hash
action Symbol # defaults to :create if not specified
endгде:
-
directoryявляется ресурсом. -
name— имя блока ресурса; когда свойствоpathне указано,nameтакже является путем к каталогу от корня -
actionопределяет шаги, которые Chef Infra Client предпримет для приведения узла в желаемое состояние -
group,inherits,mode,owner,path,recursive, иrights— это свойства этого ресурса с указанным типом Ruby. Подробнее о всех свойствах, которые могут быть использованы с этим ресурсом, см. раздел «Свойства» ниже.
Действия
Ресурс каталога имеет следующие действия:
:create- По умолчанию. Создает каталог. Если каталог уже существует (но не совпадает), обновите этот каталог, чтобы он соответствовал.
:delete- Удаляет каталог.
:nothing- Этот блок ресурса не действует, пока не получит уведомление от другого ресурса о выполнении действия. После уведомления этот блок ресурса либо выполняется немедленно, либо помещается в очередь для выполнения в конце выполнения Chef Infra Client.
Свойства
Ресурс каталога имеет следующие свойства:
-
group - Тип Ruby: Целое число, строка
Строка или идентификатор, определяющий владельца группы по имени группы или SID, включая полные имена групп, такие как
domain\groupилиgroup@domain. Если это значение не указано, существующие группы остаются неизменными, а новые назначения групп используют стандартную группуPOSIX(если доступна).
-
inherits - Тип Ruby: true, false | Значение по умолчанию:
trueТолько Microsoft Windows. Наследует ли файл права из родительского каталога.
-
mode - Тип Ruby: Целое число, строка
Приведенная строка из 3–5 символов, определяющая восьмеричный режим. Например:
'755','0755', или00755. Еслиmodeне указано, и если каталог уже существует, используется существующий режим каталога. Еслиmodeне указано, каталог не существует, и указано действие:create, Chef Infra Client предполагает значение маски'0777', а затем применяет маску umask для системы, на которой должен быть создан каталог, к значениюmask. Например, если umask в системе —'022', Chef Infra Client использует значение по умолчанию'0755'.Поведение зависит от платформы.
Системы на основе UNIX и Linux: Приведенная строка из 3–5 символов, определяющая восьмеричный режим, передаваемый в
chmod. Например:'755','0755', или00755. Если значение указано как строка, оно работает так же, как если бы командаchmodбыла передана. Если значение указано как целое число, добавьте ноль (0) к значению, чтобы оно интерпретировалось как восьмеричное число. Например, чтобы назначить права чтения, записи и выполнения для всех пользователей, используйте'0777'или'777'; для тех же прав плюс бит «sticky» используйте01777или'1777'.Microsoft Windows: Приведенная строка из 3–5 символов, определяющая восьмеричный режим, который преобразуется в права безопасности Microsoft Windows. Например:
'755','0755', или00755. Разрешены значения до'0777'(без битов «sticky») и имеют то же значение в Microsoft Windows, что и в UNIX, где4равноGENERIC_READ,2равноGENERIC_WRITE, и1равноGENERIC_EXECUTE. Это свойство не может быть использовано для установки:full_control. Это свойство не имеет эффекта, если не указано, но когда оно иrightsуказаны оба, эффекты суммируются.
-
owner - Тип Ruby: Целое число, строка
Строка или идентификатор, определяющий владельца группы по имени пользователя или SID, включая полные имена пользователей, такие как
domain\userилиuser@domain. Если это значение не указано, существующие владельцы остаются неизменными, а новые назначения владельцев используют текущего пользователя (при необходимости).
-
path - Тип Ruby: Строка | Значение по умолчанию:
The resource block's nameПуть к каталогу. Рекомендуется использовать полный путь, но это не всегда необходимо. Значение по умолчанию:
nameблока ресурса. Подробности см. в разделе «Синтаксис» выше.
-
recursive - Тип Ruby: true, false | Значение по умолчанию:
falseРекурсивное создание или удаление родительских каталогов. Для свойств владельца, группы и режима значение этого свойства применяется только к листу каталогов.
-
rights - Тип Ruby: Целое число, строка
Только Microsoft Windows. Разрешения для пользователей и групп в среде Microsoft Windows. Например:
rights <permissions>, <principal>, <options>где<permissions>задаёт права, предоставляемые субъекту,<principal>— имя группы или пользователя, а<options>— словарь с одним (или более) расширенными параметрами прав.
Рекурсивные каталоги
Ресурс remote_directory может использоваться для рекурсивного создания пути за пределами структуры удалённых каталогов, но права этих внешних путей не управляются. Это связано с тем, что атрибут recursive применяет значения атрибутов group, mode, и owner только к самому удалённому каталогу и любым внутренним каталогам, которые копируются ресурсом.
Структура каталогов:
/foo
/bar
/baz
Следующий пример демонстрирует способ создания файла в каталоге /baz:
remote_directory '/foo/bar/baz' do
owner 'root'
group 'root'
mode '0755'
action :create
end
Но в этом примере значения атрибутов group, mode, и owner будут применены только к /baz. Что нормально, если это именно то, что вам нужно. Но в большинстве случаев, когда вся структура каталогов /foo/bar/baz отсутствует, необходимо быть явным в отношении каждого каталога. Например:
%w( /foo /foo/bar /foo/bar/baz ).each do |path|
remote_directory path do
owner 'root'
group 'root'
mode '0755'
end
end
Этот подход создаст правильную иерархию—/foo, затем /bar в /foo, а затем /baz в /bar—и также с правильными значениями атрибутов group, mode, и owner.
Безопасность файлов 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, или целое число. -
Целые числа, используемые для прав, должны соответствовать следующему списку FileSystemRights Enum полей.
These permissions are cumulative. If `:write` is specified, then it
includes `:read`. If `:full_control` is specified, then it includes
both `:write` and `:read`.
(For those who know the Microsoft Windows API: `:read` corresponds
to `GENERIC_READ`; `:write` corresponds to `GENERIC_WRITE`;
`:read_execute` corresponds to `GENERIC_READ` and `GENERIC_EXECUTE`;
`:modify` corresponds to `GENERIC_WRITE`, `GENERIC_READ`,
`GENERIC_EXECUTE`, and `DELETE`; `:full_control` corresponds to
`GENERIC_ALL`, which allows a user to change the owner and other
metadata about a file.)
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 Infra Client.
Уведомления
-
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 для этого действия.
Обратите внимание, что 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.
Примеры
Следующие примеры демонстрируют различные подходы к использованию ресурса directory в рецептах:
Создание каталога
directory '/tmp/something' do
owner 'root'
group 'root'
mode '0755'
action :create
end
Создание каталога в Microsoft Windows
directory "C:\\tmp\\something" do
rights :full_control, "DOMAIN\\User"
inherits false
action :create
end
или:
directory 'C:\tmp\something' do
rights :full_control, 'DOMAIN\User'
inherits false
action :create
end
Примечание
Различие между двумя предыдущими примерами заключается в использовании одинарных и двойных кавычек, где при использовании двойных кавычек символ обратной косой черты (\) должен быть экранирован с помощью символа экранирования Ruby (которым является обратная косая черта).
Рекурсивное создание каталога
%w{dir1 dir2 dir3}.each do |dir|
directory "/tmp/mydirs/#{dir}" do
mode '0755'
owner 'root'
group 'root'
action :create
recursive true
end
end
Удаление каталога
directory '/tmp/something' do
recursive true
action :delete
end
Установка разрешений каталога с использованием переменной
Следующий пример демонстрирует, как можно установить разрешения на чтение/запись/исполнение с использованием переменной с именем user_home, а затем для владельцев и групп на любом соответствующем узле:
user_home = "/#{node[:matching_node][:user]}"
directory user_home do
owner 'node[:matching_node][:user]'
group 'node[:matching_node][:group]'
mode '0755'
action :create
end
где matching_node представляет тип узла. Например, если переменная user_home задаёт значение {node[:nginx]...}, рецепт может выглядеть следующим образом:
user_home = "/#{node[:nginx][:user]}"
directory user_home do
owner 'node[:nginx][:user]'
group 'node[:nginx][:group]'
mode '0755'
action :create
end
Установка разрешений каталога для определенного типа узла
Следующий пример показывает, как можно установить разрешения для каталога /certificates на любом узле, на котором работает Nginx. В этом примере разрешения устанавливаются для свойств owner и group как root, а затем разрешения на чтение и запись предоставляются пользователю root.
directory "#{node[:nginx][:dir]}/shared/certificates" do
owner 'root'
group 'root'
mode '0755'
recursive true
end
Перезагрузка конфигурации
Следующий пример показывает, как перезагрузить конфигурацию chef-клиента с использованием ресурса remote_file для:
- использования оператора if для проверки, являются ли плагины на узле последними версиями
- определения расположения, в котором хранятся плагины Ohai
- использования свойства
notifiesи ресурса ruby_block для запуска обновления (при необходимости) и перезагрузки файла client.rb.
directory 'node[:ohai][:plugin_path]' do
owner 'chef'
recursive true
end
ruby_block 'reload_config' do
block do
Chef::Config.from_file('/etc/chef/client.rb')
end
action :nothing
end
if node[:ohai].key?(:plugins)
node[:ohai][:plugins].each do |plugin|
remote_file node[:ohai][:plugin_path] +"/#{plugin}" do
source plugin
owner 'chef'
notifies :run, 'ruby_block[reload_config]', :immediately
end
end
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/directory/