Ресурс remote_file
Эта страница сгенерирована из исходного кода Chef. Чтобы предложить изменение, отредактируйте файл remote_file.rb и отправьте запрос на включение изменений в репозиторий Chef.
Страница справочника по ресурсам
Используйте ресурс remote_file для передачи файла из удаленного местоположения с использованием специфики файла. Этот ресурс похож на ресурс file.
Примечание
Извлечение файлов из каталога files/ в книге рецептов следует выполнять с помощью ресурса cookbook_file.
Синтаксис
Блок ресурсов remote_file управляет файлами, используя файлы, которые существуют удаленно. Например, чтобы записать домашнюю страницу для веб-сайта Apache:
remote_file '/var/www/customers/public_html/index.html' do
source 'http://somesite.com/index.html'
owner 'web_admin'
group 'web_admin'
mode '0755'
action :create
end
где:
-
'/var/www/customers/public_html/index.html'— путь к файлу, который нужно создать -
'http://somesite.com/index.html'указывает местоположение удаленного файла, файл загружается оттуда -
owner,groupиmodeопределяют права доступа
Полный синтаксис для всех доступных свойств ресурса remote_file:
remote_file 'name' do
atomic_update true, false
authentication # default value: remote
backup Integer, false # default value: 5
checksum String
content String, nil
diff String, nil
force_unlink true, false # default value: false
ftp_active_mode true, false # default value: false
group String, Integer
headers Hash
inherits true, false
manage_symlink_source true, false
mode String, Integer
notifies # see description
owner String, Integer
path String # defaults to 'name' if not specified
rights Hash
source String, Array
subscribes # see description
use_conditional_get true, false
verify String, Block
remote_domain String
remote_password String
remote_user String
show_progress true, false # default value: false
use_etag true, false # default value: true
use_last_modified true, false # default value: true
sensitive true, false # default value: false
verifications Array
action Symbol # defaults to :create if not specified
endгде:
-
remote_file— ресурс. -
name— имя, присвоенное блоку ресурса. -
actionопределяет, какие шаги предпримет клиент Chef Infra для приведения узла в желаемое состояние. -
atomic_update,authentication,backup,checksum,content,force_unlink,ftp_active_mode,group,headers,manage_symlink_source,mode,owner,path,remote_domain,remote_password,remote_user,show_progress,use_etag,use_last_modifiedиverifications— свойства, доступные для этого ресурса.
Действия
Ресурс remote_file имеет следующие действия:
:create- По умолчанию. Создать файл. Если файл уже существует (но не совпадает), обновите этот файл, чтобы он совпадал.
:create_if_missing- Создать файл только если файл не существует. Когда файл существует, ничего не происходит.
:delete- Удалить файл.
:nothing- Этот блок ресурсов не выполняет никаких действий, если не получит уведомление от другого ресурса о необходимости выполнить действие. После получения уведомления этот блок ресурсов либо запускается немедленно, либо помещается в очередь для запуска в конце выполнения клиента Chef Infra.
:touch- Коснитесь файла. Это обновляет время доступа (atime) и время изменения файла (mtime). (Это действие может использоваться с этим ресурсом, но обычно используется только с ресурсом file.)
Свойства
Ресурс remote_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.
authentication-
Тип Ruby: Symbol | Значение по умолчанию:
:remoteДопустимые значения::local, :remote
backup-
Тип Ruby: Integer, false | Значение по умолчанию:
5Количество резервных копий, которые необходимо сохранить в
/var/chef/backup(для платформ на базе UNIX и Linux) илиC:/chef/backup(для платформы Microsoft Windows). Установите значениеfalse, чтобы предотвратить сохранение резервных копий.
checksum-
Тип Ruby: String
Необязательно, см.
use_conditional_get. Контрольная сумма SHA-256 файла. Используется для предотвращения повторной загрузки файла. Когда локальный файл совпадает с контрольной суммой, клиент Chef Infra не загружает его.
force_unlink-
Тип Ruby: true, false | Значение по умолчанию:
falseКак клиент Chef Infra обрабатывает определенные ситуации, когда целевой файл оказывается не файлом. Например, когда целевой файл на самом деле является символической ссылкой. Установите значение
true, чтобы клиент Chef Infra удалил целевой объект, не являющийся файлом, и заменил его указанным файлом. Установите значениеfalse, чтобы клиент Chef Infra выдал ошибку.
ftp_active_mode-
Тип Ruby: true, false | Значение по умолчанию:
falseИспользует ли клиент Chef Infra активный или пассивный FTP. Установите значение
trueдля использования активного FTP.
group-
Тип Ruby: Integer, String
Строка или идентификатор, который идентифицирует владельца группы по имени группы или SID, включая полные квалифицированные имена групп, такие как
domain\groupилиgroup@domain. Если это значение не указано, существующие группы остаются неизменными, а новые назначения групп используют группу по умолчаниюPOSIX(если доступна).
headers-
Тип Ruby: Hash
Хэш пользовательских заголовков. Например:
headers({ "Cookie" => "user=grantmc; pass=p@ssw0rd!" })или:
headers({ "Referer" => "#{header}" })или:
headers( "Authorization"=>"Basic #{ Base64.encode64("#{username}:#{password}").gsub("\n", "") }" )
ignore_failure-
Тип Ruby: true, false | Значение по умолчанию:
falseПродолжать выполнение рецепта, если ресурс завершится неудачей по любой причине.
inherits-
Тип Ruby: true, false | Значение по умолчанию:
trueТолько для Microsoft Windows. Наследует ли файл права от родительского каталога.
manage_symlink_source-
Тип Ruby: true, false | Значение по умолчанию:
true(с предупреждением)
Измените поведение файлового ресурса, если он указывает на символическую ссылку. Когда это значение установлено в
true, клиент Chef Infra будет управлять правами символической ссылки или заменит символическую ссылку обычным файлом, если у ресурса есть содержимое. Когда это значение установлено вfalse, клиент Chef Infra будет следовать символической ссылке и будет управлять правами и содержимым целевого файла символической ссылки.Поведение по умолчанию —
true, но выдает предупреждение о том, что значение по умолчанию будет изменено наfalseв будущей версии; явное задание этого значения вtrueилиfalseподавляет это предупреждение.
mode-
Тип Ruby: Integer, String
Строка из 3-5 символов, которая определяет октальный режим. Например:
'755','0755'или00755. Если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указаны одновременно, эффекты являются кумулятивными.
notifies-
Тип Ruby: Symbol, Chef::Resource\[String\]
Ресурс может уведомить другой ресурс о необходимости выполнить действие, когда его состояние изменится. Укажите
'resource[name]',:action, которое должен выполнить этот ресурс, а затем:timerдля этого действия. Ресурс может уведомить более одного ресурса; используйте операторnotifiesдля каждого ресурса, который необходимо уведомить.Если ссылаемый ресурс не существует, возникает ошибка. В отличие от этого,
subscribesне завершится ошибкой, если исходный ресурс не найден.Таймер указывает точку во время выполнения клиента Chef Infra, в которой выполняется уведомление. Доступны следующие таймеры:
:beforeУказывает, что действие в уведомленном ресурсе должно быть выполнено до обработки блока ресурса, в котором находится уведомление.
:delayedПо умолчанию. Указывает, что уведомление должно быть помещено в очередь, а затем выполнено в конце выполнения клиента Chef Infra.
-
:immediate,:immediately Указывает, что уведомление должно быть выполнено немедленно, для каждого уведомленного ресурса.
Синтаксис для
notifies:notifies :action, 'resource[name]', :timer
owner-
Тип Ruby: Integer, String
Строка или идентификатор, определяющий владельца группы по имени пользователя или SID, включая полные имена пользователей, такие как
domain\userилиuser@domain. Если это значение не указано, существующие владельцы остаются неизменными, а новые назначения владельцев используют текущего пользователя (при необходимости).
path-
Тип Ruby: String | Значение по умолчанию:
The resource block's nameПолный путь к файлу, включая имя файла и его расширение. Значение по умолчанию:
nameблока ресурсов. Для получения дополнительной информации см. раздел «Синтаксис» выше.
remote_user-
Тип Ruby: String
Только Windows Имя пользователя с доступом к удалённому файлу, указанному свойством
source. Имя пользователя можно необязательно указать с доменом, например:domain\userилиuser@my.dns.domain.comв формате Universal Principal Name (UPN). Домен также можно задать с помощью свойстваremote_domain. Обратите внимание, что это свойство игнорируется, еслиsourceне является UNC-путем. Если это свойство указано, обязательно указать свойствоremote_password.Новое в Chef Client 13.4
remote_password-
Тип Ruby: String
Только Windows Пароль пользователя, указанного свойством
remote_user. Это свойство необходимо, если указан remote_user, и может быть указано только в том случае, если указаноremote_user. Свойствоsensitiveдля данного ресурса автоматически будет установлено вtrue, если указаноremote_password.Новое в Chef Client 13.4
remote_domain-
Тип Ruby: String
Только Windows Домен пользователя, указанного свойством
remote_user. По умолчанию ресурс будет аутентифицироваться в домене удалённой системы или как локальный учётная запись, если удалённая система не присоединена к домену. Если удалённая система не входит в домен, необходимо аутентифицироваться как локальный пользователь на удалённой системе, установив домен в., например:remote_domain ".". Домен также можно указать как часть свойстваremote_user.Новое в Chef Client 13.4
retries-
Тип Ruby: Integer | Значение по умолчанию:
0Количество попыток перехвата исключений и повторной обработки ресурса.
retry_delay-
Тип Ruby: Integer | Значение по умолчанию:
2Задержка повторной попытки (в секундах).
rights-
Тип Ruby: Integer, String
Только Microsoft Windows. Разрешения для пользователей и групп в среде Microsoft Windows. Например:
rights <permissions>, <principal>, <options>, где<permissions>определяет права, предоставляемые принципалу,<principal>— имя группы или пользователя, а<options>— хэш с одним (или несколькими) дополнительными параметрами прав.
source-
Тип Ruby: String, Array
Обязательно. Местоположение исходного файла. Местоположение исходного файла может быть HTTP (
http://), FTP (ftp://), SFTP (sftp://), локальным (file:///) или UNC (\\host\share\file.tar.gz).Существует множество способов определить местоположение исходного файла. С помощью пути:
source 'http://couchdb.apache.org/img/sketch.png'С помощью FTP:
source 'ftp://remote_host/path/to/img/sketch.png'С помощью SFTP:
source 'sftp://username:password@remote_host:22/path/to/img/sketch.png'С помощью локального пути:
source 'file:///path/to/img/sketch.png'С помощью Microsoft Windows UNC:
source '\\\\path\\to\\img\\sketch.png'С помощью атрибута узла:
source node['nginx']['foo123']['url']С помощью атрибутов для определения путей:
source "#{node['python']['url']}/#{version}/Python-#{version}.tar.bz2"Определением нескольких путей для нескольких местоположений:
source 'http://seapower/spring.png', 'http://seapower/has_sprung.png'Определением тех же самых нескольких путей в виде массива:
source ['http://seapower/spring.png', 'http://seapower/has_sprung.png']Когда заданы несколько путей, Chef Infra Client попытается загрузить файлы в указанном порядке, остановившись после первой успешной загрузки.
subscribes-
Тип Ruby: Symbol, 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
use_conditional_get-
Тип Ruby: true, false | Значение по умолчанию:
trueВключить условные HTTP-запросы с помощью условного
GET(с заголовком If-Modified-Since) или неявного идентификатора (ETag). Чтобы использовать заголовки If-Modified-Since, также необходимо установитьuse_last_modifiedвtrue. Чтобы использовать заголовки ETag, также необходимо установитьuse_etagвtrue.
use_etag-
Тип Ruby: true, false | Значение по умолчанию:
trueВключить заголовки ETag. Установите в
false, чтобы отключить заголовки ETag. Для использования этой настройки необходимо также установитьuse_conditional_getвtrue.
use_last_modified-
Тип Ruby: true, false | Значение по умолчанию:
trueВключить заголовки If-Modified-Since. Установите в
false, чтобы отключить заголовки If-Modified-Since. Для использования этой настройки необходимо также установитьuse_conditional_getвtrue.
show_progess-
Тип Ruby: true, false | Значение по умолчанию:
falseОтображает процесс загрузки файла. Установите в
true, чтобы включить эту функцию.
sensitive-
Тип Ruby: true, false | Значение по умолчанию:
falseГарантирует, что конфиденциальные данные ресурсов не регистрируются Chef Infra Client.
verify-
Тип Ruby: String, Block
Блок или строка, возвращающая
trueилиfalse. Строка, когдаtrueвыполняется как системная команда.Блок — произвольный Ruby, определённый в блоке ресурса с помощью свойства
verify. Когда блокtrue, Chef Infra Client продолжит обновление файла как необходимо.Например, это должно вернуть
true:remote_file '/tmp/baz' do verify { 1 == 1 } endЭто должно вернуть
true:remote_file '/etc/nginx.conf' do verify 'nginx -t -c %{path}' endЭто должно вернуть
true:remote_file '/tmp/bar' do verify { 1 == 1} endА это должно вернуть
true:remote_file '/tmp/foo' do verify do |path| true end endВ то время как это должно вернуть
false:remote_file '/tmp/turtle' do verify '/usr/bin/false' endЕсли строка или блок возвращают
false, выполнение Chef Infra Client прекращается и возвращается ошибка.
Атомарные обновления файлов
Атомарные обновления используются с ресурсами на основе файлов, чтобы обеспечить возможность обновления файлов при обновлении двоичных файлов или при недостатке места на диске.
Атомарные обновления включены по умолчанию. Их можно управлять глобально с помощью настройки 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 Infra Client файлов, которые уже присутствуют на узле, используйте один из следующих атрибутов в рецепте: use_conditional_get (по умолчанию) или checksum.
- Атрибут
use_conditional_get— это стандартное поведение Chef Infra Client. Если удаленный файл находится на сервере, который поддерживает заголовки ETag и/или If-Modified-Since, Chef Infra Client будет использовать условнуюGET, чтобы определить, был ли файл обновлен. Если файл был обновлен, Chef Infra Client повторно загрузит его. - Атрибут
checksumпопросит Chef Infra Client сравнить контрольную сумму локального файла с контрольной суммой удаленного файла. Если они совпадают, Chef Infra Client не будет повторно загружать файл. Для сравнения с помощью локальной контрольной суммы требуется, чтобы локальная контрольная сумма была правильной.
Желаемый подход зависит только от желаемого рабочего процесса. Например, если узлу ежедневно требуется новый файл, для подхода с контрольной суммой необходимо будет также обновлять и/или проверять локальную контрольную сумму ежедневно, чтобы убедиться, что локальная контрольная сумма является правильной. Использование условной GET в этом сценарии значительно упростит управление, необходимое для точного обновления файлов.
Доступ к удаленному пути UNC в Windows
Ресурс remote_file в Windows поддерживает доступ к файлам с удаленного ресурса SMB/CIFS. Имя файла должно быть указано в свойстве source как путь UNC, например, \myserver\myshare\mydirectory\myfile.txt. Это позволяет получить доступ к файлу по этому пути, даже если процесс Chef Infra Client не имеет разрешения на доступ к файлу. Учетные данные для аутентификации на удаленной системе могут быть указаны с помощью свойств remote_user, remote_domain и remote_password, когда пользователь, под которым работает Chef Infra Client, не имеет доступа к удаленному файлу. См. раздел «Свойства» для получения более подробной информации об этих параметрах.
Примечание: Это главным образом для доступа к удаленным файлам, когда пользователь, под которым работает Chef Infra Client, не имеет достаточного доступа, и необходимо указать альтернативные учетные данные. Если у пользователя уже есть доступ, учетные данные указывать не нужно. В случае, когда локальная и удаленная системы находятся в одной домене, свойства remote_user и remote_password часто не нужно указывать, так как пользователь, возможно, уже имеет доступ к удаленной общей папке.
Примеры:
Доступ к файлу от имени пользователя другой доменной учетной записи:
remote_file 'E:/domain_test.txt' do
source '\\myserver\myshare\mydirectory\myfile.txt'
remote_domain 'domain'
remote_user 'username'
remote_password 'password'
end
ИЛИ
remote_file 'E:/domain_test.txt' do
source '\\myserver\myshare\mydirectory\myfile.txt'
remote_user 'domain\username'
remote_password 'password'
end
Доступ к файлу с помощью локальной учетной записи на удаленной машине:
remote_file 'E:/domain_test.txt' do
source '\\myserver\myshare\mydirectory\myfile.txt'
remote_domain '.'
remote_user 'username'
remote_password 'password'
end
ИЛИ
remote_file 'E:/domain_test.txt' do
source '\\myserver\myshare\mydirectory\myfile.txt'
remote_user '.\username'
remote_password 'password'
end
Примеры
В следующих примерах показаны различные подходы к использованию ресурса remote_file в рецептах:
Передача файла из URL
remote_file '/tmp/testfile' do
source 'http://www.example.com/tempfiles/testfile'
mode '0755'
checksum '3a7dac00b1' # A SHA256 (or portion thereof) of the file.
end
Передача файла только при изменении источника
remote_file '/tmp/couch.png' do
source 'http://couchdb.apache.org/img/sketch.png'
action :nothing
end
http_request 'HEAD http://couchdb.apache.org/img/sketch.png' do
message ''
url 'http://couchdb.apache.org/img/sketch.png'
action :head
if ::File.exist?('/tmp/couch.png')
headers 'If-Modified-Since' => File.mtime('/tmp/couch.png').httpdate
end
notifies :create, 'remote_file[/tmp/couch.png]', :immediately
end
Установка файла из удаленного расположения с помощью bash
В следующем примере показано, как установить модуль foo123 для Nginx. Этот модуль добавляет функциональность в стиле оболочки в файл конфигурации Nginx и выполняет следующие действия:
- Объявляет три переменных
- Получает файл Nginx из удаленного расположения
- Устанавливает файл с помощью Bash в путь, указанный переменной
src_filepath
# the following code sample is similar to the ``upload_progress_module``
# recipe in the ``nginx`` cookbook:
# https://github.com/chef-cookbooks/nginx
src_filename = "foo123-nginx-module-v#{
node['nginx']['foo123']['version']
}.tar.gz"
src_filepath = "#{Chef::Config['file_cache_path']}/#{src_filename}"
extract_path = "#{
Chef::Config['file_cache_path']
}/nginx_foo123_module/#{
node['nginx']['foo123']['checksum']
}"
remote_file 'src_filepath' do
source node['nginx']['foo123']['url']
checksum node['nginx']['foo123']['checksum']
owner 'root'
group 'root'
mode '0755'
end
bash 'extract_module' do
cwd ::File.dirname(src_filepath)
code <<-EOH
mkdir -p #{extract_path}
tar xzf #{src_filename} -C #{extract_path}
mv #{extract_path}/*/* #{extract_path}/
EOH
not_if { ::File.exist?(extract_path) }
end
Сохранение определенных настроек
Следующий рецепт показывает, как можно использовать файл атрибутов для хранения определенных настроек. Файл атрибутов расположен в каталоге attributes/ в том же кулинарном наборе, что и рецепт, который вызывает файл атрибутов. В этом примере файл атрибутов определяет определенные настройки для Python, которые затем используются на всех узлах, на которых будет выполняться этот рецепт.
У пакетов Python есть версии, каталоги установки, URL-адреса и файлы контрольных сумм. Файл атрибутов, предназначенный для поддержки такого типа рецептов, должен содержать настройки, подобные следующим:
default['python']['version'] = '2.7.1'
if python['install_method'] == 'package'
default['python']['prefix_dir'] = '/usr'
else
default['python']['prefix_dir'] = '/usr/local'
end
default['python']['url'] = 'http://www.python.org/ftp/python'
default['python']['checksum'] = '80e387...85fd61'
а затем методы в рецепте могут ссылаться на эти значения. Рецепту, используемому для установки Python, потребуется выполнить следующие действия:
- Определить каждый пакет для установки (подразумевается в этом примере, не показано)
- Определить переменные для пакета
versionиinstall_path - Получить пакет из удаленного расположения, но только если пакет еще не существует на целевой системе
- Использовать ресурс bash для установки пакета на узел, но только если пакет еще не установлен
# the following code sample comes from the ``oc-nginx`` cookbook on |github|: https://github.com/cookbooks/oc-nginx
version = node['python']['version']
install_path = "#{node['python']['prefix_dir']}/lib/python#{version.split(/(^\d+\.\d+)/)[1]}"
remote_file "#{Chef::Config[:file_cache_path]}/Python-#{version}.tar.bz2" do
source "#{node['python']['url']}/#{version}/Python-#{version}.tar.bz2"
checksum node['python']['checksum']
mode '0755'
not_if { ::File.exist?(install_path) }
end
bash 'build-and-install-python' do
cwd Chef::Config[:file_cache_path]
code <<-EOF
tar -jxvf Python-#{version}.tar.bz2
(cd Python-#{version} && ./configure #{configure_options})
(cd Python-#{version} && make && make install)
EOF
not_if { ::File.exist?(install_path) }
end
Использование метода platform_family?
Ниже приведен пример использования метода platform_family? в Recipe DSL для создания переменной, которую можно использовать с другими ресурсами в том же рецепте. В этом примере используется platform_family?, чтобы гарантировать использование определённого двоичного файла для определённой платформы перед использованием ресурса remote_file для скачивания файла из удалённого места и последующего использования ресурса execute для установки этого файла путём выполнения команды.
if platform_family?('rhel')
pip_binary = '/usr/bin/pip'
else
pip_binary = '/usr/local/bin/pip'
end
remote_file "#{Chef::Config[:file_cache_path]}/distribute_setup.py" do
source 'http://python-distribute.org/distribute_setup.py'
mode '0755'
not_if { File.exist?(pip_binary) }
end
execute 'install-pip' do
cwd Chef::Config[:file_cache_path]
command <<-EOF
# command for installing Python goes here
EOF
not_if { File.exist?(pip_binary) }
end
где команда для установки Python может выглядеть примерно так:
#{node['python']['binary']} distribute_setup.py
#{::File.dirname(pip_binary)}/easy_install pip
Указание локального пути к файлу Windows в качестве допустимого URI
При указании локального пути к файлу Microsoft Windows в качестве допустимого URI файла требуется дополнительный слэш (/). Например:
remote_file 'file:///c:/path/to/file' do
... # other attributes
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/remote_file/