пакет Resource
Эта страница сгенерирована из исходного кода Chef. Чтобы предложить изменение, отредактируйте файл package.rb и отправьте запрос на вытягивание в репозиторий Chef.
Используйте ресурс package для управления пакетами. Когда пакет устанавливается из локального файла (например, с помощью RubyGems, dpkg или RPM Package Manager), файл необходимо добавить в узел с помощью ресурсов remote_file или cookbook_file.
Этот ресурс является базовым ресурсом для нескольких других ресурсов, используемых для управления пакетами на определенных платформах. Хотя можно использовать каждый из этих специфических ресурсов, рекомендуется использовать ресурс package как можно чаще.
Дополнительную информацию о конкретных ресурсах для конкретных платформ см. в следующих разделах:
- apt_package
- bff_package
- cab_package
- chef_gem
- chocolatey_package
- dmg_package
- dnf_package
- dpkg_package
- freebsd_package
- gem_package
- homebrew_package
- ips_package
- macports_package
- msu_package
- openbsd_package
- pacman_package
- paludis_package
- portage_package
- rpm_package
- smartos_package
- snap_package
- solaris_package
- windows_package
- yum_package
- zypper_package
Синтаксис
Блок ресурса package управляет пакетом на узле, как правило, устанавливая его. Простейшее использование ресурса package:
package 'httpd'
что установит Apache со всеми стандартными параметрами и стандартным действием (:install).
Для пакета с различными именами пакетов в зависимости от платформы используйте case оператор в блоке package:
package 'Install Apache' do
case node[:platform]
when 'redhat', 'centos'
package_name 'httpd'
when 'ubuntu', 'debian'
package_name 'apache2'
end
end
где:
-
'redhat', 'centos'установит Apache с пакетомhttpdи'ubuntu', 'debian'установит его с пакетомapache2
Полный синтаксис всех доступных свойств ресурса package:
package 'name' do
allow_downgrade true, false # Yum, RPM packages only
arch String, Array # Yum packages only
default_release String # Apt packages only
flush_cache Array
gem_binary String
homebrew_user String, Integer # Homebrew packages only
notifies # see description
options String
package_name String, Array # defaults to 'name' if not specified
response_file String # Apt packages only
response_file_variables Hash # Apt packages only
source String
subscribes # see description
timeout String, Integer
version String, Array
action Symbol # defaults to :install if not specified
endгде:
-
packageсообщает Chef Infra Client о необходимости управления пакетом; Chef Infra Client определит соответствующий поставщик пакетов на основе платформы, работающей на узле -
'name'— имя пакета -
actionопределяет шаги, которые Chef Infra Client выполнит для приведения узла в нужное состояние -
allow_downgrade,arch,default_release,flush_cache,gem_binary,homebrew_user,options,package_name,response_file,response_file_variables,source,recursive,timeout, иversion— свойства этого ресурса с указанным типом Ruby. Подробную информацию обо всех свойствах, которые могут использоваться с этим ресурсом, см. в разделе «Свойства» ниже.
Параметры пакета Gem
Поставщик пакетов RubyGems пытается использовать API RubyGems для установки камней без запуска нового процесса, когда это возможно. Команда gems для установки будет запущена в следующих условиях:
- Когда свойство
gem_binaryуказано (в виде массива, строки или файла .gemrc), Chef Infra Client выполнит эту команду для проверки настроек среды, а затем снова для установки камня. - Когда параметры установки указаны как строка, Chef Infra Client запустит команду gems с этими параметрами при установке камня.
- Инсталлятор Chef будет искать команду gems в
PATHвместо использования по умолчанию текущей среды gem. В рамкахenforce_path_sanity, каталогиbinдобавляются вPATH, что означает, что при отсутствии других предшествующих RubyGems установка всё равно будет осуществлена относительно него.
Указание с помощью массива
Если явное свойство gem_binary не используется с ресурсом gem_package, предпочтительно предоставлять параметры установки в виде массива. Этот подход позволяет поставщику устанавливать камень без необходимости запуска внешнего процесса gem.
Доступны следующие параметры RubyGems для включения в массив и передачи в RubyGems DependencyInstaller:
:env_shebang:force:format_executable:ignore_dependencies:prerelease:security_policy:wrappers
Дополнительную информацию об этих параметрах см. в документации по RubyGems: http://rubygems.rubyforge.org/rubygems-update/Gem/DependencyInstaller.html.
Примерgem_package 'bundler' do
options(prerelease: true, format_executable: false)
end
Указание со строкой
Когда используется явноеgem_binary, параметры должны передаваться в виде строки. Когда не используется явное gem_binary, Chef Infra Client вынужден запускать процесс gems для установки камней (что использует больше системных ресурсов), когда параметры передаются в виде строки. Строковые параметры передаются непосредственно в команду gems и должны быть указаны так же, как если бы они передавались в командной строке. Например, --prerelease для камня предварительной версии. Примерgem_package 'nokogiri' do
gem_binary('/opt/ree/bin/gem')
options('--prerelease --no-format-executable')
end
Указание с помощью файла .gemrc
Параметры могут быть указаны в файле .gemrc. По умолчанию ресурсgem_package будет использовать Ruby-интерфейс для установки камней, игнорируя файл .gemrc. Ресурс gem_package можно заставить использовать команду gems вместо этого (и читать файл .gemrc), добавив атрибут gem_binary в блок кода.
Шаблон с именем gemrc.erb находится в каталоге /templates кулинарной книги:
:sources:
- http://<%= node['gem_file']['host'] %>:<%= node['gem_file']['port'] %>/
Рецепт может быть создан для выполнения следующих действий:
- Создаёт файл
.gemrcна основе шаблонаgemrc.erb - Выполняет команду
Gem.configuration - Устанавливает пакет с помощью файла
.gemrc
template '/root/.gemrc' do
source 'gemrc.erb'
action :create
notifies :run, 'ruby_block[refresh_gemrc]', :immediately
end
ruby_block 'refresh_gemrc' do
action :nothing
block do
Gem.configuration = Gem::ConfigFile.new []
end
end
gem_package 'di-ruby-lvm' do
gem_binary '/opt/chef/embedded/bin/gem'
action :install
end
Действия
Ресурс package имеет следующие действия:
:install- По умолчанию. Устанавливает пакет. Если указана версия, устанавливает указанную версию пакета.
:nothing- Этот блок ресурса не действует, пока не получит уведомление от другого ресурса о действии. После уведомления этот блок ресурса либо выполняется немедленно, либо помещается в очередь для выполнения в конце выполнения Chef Infra Client.
:purge- Удаляет пакет. Это действие обычно удаляет также и конфигурационные файлы (только для платформы Debian; для других платформ используйте действие
:remove). :reconfig- Переконфигурирует пакет. Это действие требует файла ответов.
:remove- Удаляет пакет.
:upgrade- Устанавливает пакет и/или гарантирует, что пакет является последней версией.
Свойства
Ресурс package имеет следующие свойства:
allow_downgrade-
Тип Ruby: true, false | Значение по умолчанию:
trueТолько для ресурса yum_package. Снижает версию пакета для удовлетворения запрошенных требований к версии.
arch-
Тип Ruby: Строка, Массив
Только для ресурса yum_package. Архитектура устанавливаемого или обновляемого пакета. Это значение также может быть передано в качестве части имени пакета.
default_release-
Тип Ruby: Строка
Только для ресурса apt_package. Стандартный релиз. Например:
stable.
flush_cache-
Тип Ruby: Массив
Очищает кэш в оперативной памяти до или после операции Yum, которая устанавливает, обновляет или удаляет пакет. Значение по умолчанию:
[ :before, :after ]. Значение также может быть массивом:( { :before => true/false, :after => true/false } ).Yum автоматически синхронизирует удалённые метаданные с локальным кэшем. Chef Infra Client создаёт копию локального кэша и затем хранит его в оперативной памяти во время выполнения Chef Infra Client. Кэш в оперативной памяти позволяет устанавливать пакеты во время выполнения Chef Infra Client без необходимости продолжения синхронизации удалённых метаданных с локальным кэшем во время выполнения Chef Infra Client.
В виде массива:
yum_package 'some-package' do #... flush_cache [ :before ] #... endи в виде массива:
yum_package 'some-package' do #... flush_cache( { :after => true } ) #... endПримечание
Свойство
flush_cacheне очищает локальный кэш Yum! Используйте инструменты Yum —yum clean headers,yum clean packages,yum clean all— для очистки локального кэша Yum.
gem_binary-
Тип Ruby: Строка
Свойство для поставщика
gem_package, используемое для указания бинарника gems.
homebrew_user-
Тип Ruby: Строка, Целое число
Только для ресурса homebrew_package. Имя владельца Homebrew, используемого Chef Infra Client при выполнении команды.
ignore_failure-
Тип Ruby: true, false | Значение по умолчанию:
falseПродолжать выполнение рецепта, если ресурс завершается неудачно по любой причине.
notifies-
Тип Ruby: Символ, Chef::Resource\[Строка\]
Ресурс может уведомить другой ресурс о выполнении действия при изменении его состояния. Укажите
'resource[name]', действие, которое должен выполнить ресурс, и:actionдля этого действия. Ресурс может уведомить более одного ресурса; используйте операторnotifiesдля каждого ресурса, который должен быть уведомлен.Если указанный ресурс не существует, возникает ошибка. В отличие от
subscribes, который не завершается ошибкой, если исходный ресурс не найден.Таймер определяет момент во время выполнения Chef Infra Client, в котором выполняется уведомление. Доступны следующие таймеры:
:beforeУказывает, что действие над уведомлённым ресурсом должно выполняться до обработки блока ресурса, в котором расположено уведомление.
:delayedЗначение по умолчанию. Указывает, что уведомление должно быть помещено в очередь и выполнено в конце выполнения Chef Infra Client.
-
:immediate,:immediately Указывает, что уведомление должно быть выполнено немедленно, для каждого уведомлённого ресурса.
Синтаксис для
notifies:notifies :action, 'resource[name]', :timer
options-
Тип Ruby: Строка
Одна (или более) дополнительных опций, передаваемых в команду.
package_name-
Тип Ruby: Строка, Массив
Название пакета. Значение по умолчанию:
nameблока ресурса. См. раздел «Синтаксис» выше для получения дополнительной информации.
response_file-
Тип Ruby: Строка
Только для ресурсов apt_package и dpkg_package. Прямой путь к файлу, используемому для предварительной загрузки пакета.
response_file_variables-
Тип Ruby: Словарь
Только для ресурсов apt_package и dpkg_package. Словарь переменных файла ответов в формате
{"VARIABLE" => "VALUE"}.
retries-
Тип Ruby: Целое число | Значение по умолчанию:
0Количество попыток перехватить исключения и повторить ресурс.
retry_delay-
Тип Ruby: Целое число | Значение по умолчанию:
2Задержка при повторе (в секундах).
source-
Тип Ruby: Строка
Необязательно. Путь к пакету в локальной файловой системе.
Примечание
Платформа AIX требует, чтобы
sourceбыл путем к локальной файловой системе, потому чтоinstallpне извлекает пакеты с помощью HTTP или FTP.
subscribes-
Тип Ruby: Символ, Chef::Resource\[Строка\]
Ресурс может прослушивать другой ресурс и выполнять действие, если состояние прослушиваемого ресурса изменится. Укажите
'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
timeout-
Тип Ruby: Строка, Целое число
Время ожидания в секундах перед истечением таймаута.
version-
Тип Ruby: Строка, Массив
Версия пакета, который необходимо установить или обновить.
Несколько пакетов
Ресурс может указать несколько пакетов и/или версий для платформ, использующих менеджеры пакетов Apt, Chocolatey, DNF, Homebrew, Pacman или Zypper. Указание нескольких пакетов и/или версий позволяет единой транзакции:
- Загрузить указанные пакеты и версии через одну HTTP-транзакцию
- Обновить или установить несколько пакетов одним ресурсом во время выполнения Chef Infra Client
Например, установка нескольких пакетов:
package %w(package1 package2)
Установка нескольких пакетов с версиями:
package %w(package1 package2) do
version [ '1.3.4-2', '4.3.6-1']
end
Обновление нескольких пакетов:
package %w(package1 package2) do
action :upgrade
end
Удаление нескольких пакетов:
package %w(package1 package2) do
action :remove
end
Очистка нескольких пакетов:
package %w(package1 package2) do
action :purge
end
Уведомления с помощью неявного имени:
package %w(package1 package2) do
action :nothing
end
log 'call a notification' do
notifies :install, 'package[package1, package2]', :immediately
end
Примечание
Уведомления и подписки не нужно обновлять при добавлении или удалении пакетов и версий из свойств package_name или version.
Общие возможности ресурсов
Ресурсы Chef включают общие свойства, уведомления и защитные механизмы ресурсов.
Несколько пакетов
Ресурс может указать несколько пакетов и/или версий для платформ, использующих менеджеры пакетов Apt, Chocolatey, DNF, Homebrew, Pacman или Zypper. Указание нескольких пакетов и/или версий позволяет единой транзакции:
- Загрузить указанные пакеты и версии через одну HTTP-транзакцию
- Обновить или установить несколько пакетов одним ресурсом во время выполнения Chef Infra Client
Например, установка нескольких пакетов:
package %w(package1 package2)
Установка нескольких пакетов с версиями:
package %w(package1 package2) do
version [ '1.3.4-2', '4.3.6-1']
end
Обновление нескольких пакетов:
package %w(package1 package2) do
action :upgrade
end
Удаление нескольких пакетов:
package %w(package1 package2) do
action :remove
end
Очистка нескольких пакетов:
package %w(package1 package2) do
action :purge
end
Уведомления с помощью неявного имени:
package %w(package1 package2) do
action :nothing
end
log 'call a notification' do
notifies :install, 'package[package1, package2]', :immediately
end
Примечание
Уведомления и подписки не нужно обновлять при добавлении или удалении пакетов и версий из свойств package_name или version.
Примеры
Следующие примеры демонстрируют различные подходы к использованию ресурса package в рецептах:
Установите файл gems для использования в рецептах
chef_gem 'right_aws' do
action :install
end
require 'right_aws'
Установите файл gems из локальной файловой системы
gem_package 'right_aws' do
source '/tmp/right_aws-1.11.0.gem'
action :install
end
Установите пакет
package 'tar' do
action :install
end
Установите пакет версии
package 'tar' do
version '1.16.1-1'
action :install
end
Установите пакет с параметрами
package 'debian-archive-keyring' do
action :install
options '--force-yes'
end
Установите пакет с файлом ответов
Использование response_file в настоящее время поддерживается только на Debian и Ubuntu. Необходимо написать пользовательские ресурсы для поддержки использования response_file, содержащего ответы debconf на вопросы, обычно задаваемые менеджером пакетов при установке. Поместите файл в /files/default кулинарной книги, где указан пакет, и Chef Infra Client будет использовать ресурс cookbook_file для его получения.
Для установки пакета с response_file:
package 'sun-java6-jdk' do
response_file 'java.seed'
end
Установите указанную архитектуру с помощью указанного поставщика
yum_package 'glibc-devel' do
arch 'i386'
end
Очистите пакет
package 'tar' do
action :purge
end
Удалите пакет
package 'tar' do
action :remove
end
Обновите пакет
package 'tar' do
action :upgrade
end
Используйте общий атрибут ignore_failure
gem_package 'syntax' do
action :install
ignore_failure true
end
Избегайте необоснованной интерполяции строк
Сделайте так:
package 'mysql-server' do
version node['mysql']['version']
action :install
end
а не так:
package 'mysql-server' do
version "#{node['mysql']['version']}"
action :install
end
Установите пакет на платформе
Следующий пример демонстрирует, как использовать ресурс package для установки приложения с именем app и обеспечения установки правильных пакетов для правильной платформы:
package 'app_name' do
action :install
end
case node[:platform]
when 'ubuntu','debian'
package 'app_name-doc' do
action :install
end
when 'centos'
package 'app_name-html' do
action :install
end
end
Установите sudo, затем настройте файл /etc/sudoers/
Следующий пример демонстрирует, как установить sudo и настроить файл /etc/sudoers:
# the following code sample comes from the ``default`` recipe in the ``sudo`` cookbook: https://github.com/chef-cookbooks/sudo
package 'sudo' do
action :install
end
if node['authorization']['sudo']['include_sudoers_d']
directory '/etc/sudoers.d' do
mode '0755'
owner 'root'
group 'root'
action :create
end
cookbook_file '/etc/sudoers.d/README' do
source 'README'
mode '0440'
owner 'root'
group 'root'
action :create
end
end
template '/etc/sudoers' do
source 'sudoers.erb'
mode '0440'
owner 'root'
group platform?('freebsd') ? 'wheel' : 'root'
variables(
:sudoers_groups => node['authorization']['sudo']['groups'],
:sudoers_users => node['authorization']['sudo']['users'],
:passwordless => node['authorization']['sudo']['passwordless']
)
end
где
- ресурс package используется для установки sudo
- заявление
ifиспользуется для обеспечения доступности каталога/etc/sudoers.d - ресурс template указывает Chef Infra Client, где найти шаблон
sudoers - свойство
variablesпредставляет собой словарь, передающий значения в файлы шаблонов (которые расположены в каталогеtemplates/для кулинарной книги)
Используйте оператор case для указания платформы
Следующий пример показывает, как использовать оператор case, чтобы указать Chef Infra Client, какие платформы и пакеты установить с помощью cURL.
package 'curl'
case node[:platform]
when 'redhat', 'centos'
package 'package_1'
package 'package_2'
package 'package_3'
when 'ubuntu', 'debian'
package 'package_a'
package 'package_b'
package 'package_c'
end
end
где node[:platform] для каждого узла определяется Ohai во время каждого выполнения Chef Infra Client. Например:
package 'curl'
case node[:platform]
when 'redhat', 'centos'
package 'zlib-devel'
package 'openssl-devel'
package 'libc6-dev'
when 'ubuntu', 'debian'
package 'openssl'
package 'pkg-config'
package 'subversion'
end
end
Использование символов для ссылки на атрибуты
Символы могут использоваться для ссылки на атрибуты:
package 'mysql-server' do
version node[:mysql][:version]
action :install
end
вместо строк:
package 'mysql-server' do
version node['mysql']['version']
action :install
end
Использование массива пробелов для упрощения рецепта
Следующие примеры показывают различные способы выполнения одного и того же действия. Первый показывает серию пакетов, которые будут обновлены:
package 'package-a' do
action :upgrade
end
package 'package-b' do
action :upgrade
end
package 'package-c' do
action :upgrade
end
package 'package-d' do
action :upgrade
end
а следующий использует один ресурс пакета и массив пробелов (%w):
package %w{package-a package-b package-c package-d} do
action :upgrade
end
Указание пользователя Homebrew с UUID
homebrew_package 'emacs' do
homebrew_user 1001
end
Указание пользователя Homebrew со строкой
homebrew_package 'vim' do
homebrew_user 'user1'
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/package/