пакет Resource
Эта страница сгенерирована из исходного кода Chef Infra Client. Чтобы предложить изменение, отредактируйте файл package.rb и отправьте запрос на вытягивание в репозиторий Chef Infra Client.
Используйте ресурс 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 для установки gem без запуска нового процесса, когда это возможно. Команда gems для установки будет запущена в следующих случаях:
- Если указано свойство
gem_binary(в виде хэша, строки или файла .gemrc), Chef Infra Client выполнит эту команду для проверки настроек среды, а затем снова для установки gem. - Если параметры установки указаны в виде строки, Chef Infra Client запустит команду gems с этими параметрами при установке gem.
- Установщик Chef будет искать команду gem в
PATHвместо того, чтобы использовать текущую среду gem. В рамкахenforce_default_paths, каталогиbinдобавляются вPATH, что означает, что при отсутствии других последующих RubyGems установка все равно будет выполняться относительно него.
Указание с помощью хэша
Если параметр gem_binary явно не используется с ресурсом gem_package, предпочтительно указать параметры установки в виде хэша. Этот подход позволяет поставщику устанавливать gem без необходимости запуска внешнего процесса 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 для установки gem (что использует больше системных ресурсов), когда параметры передаются в виде строки. Параметры строк передаются verbatim в команду gems и должны быть указаны так же, как если бы они были переданы в командной строке. Например, --prerelease для предварительной версии gem. Пример gem_package 'nokogiri' do
gem_binary('/opt/ree/bin/gem')
options('--prerelease --no-format-executable')
end
Указание с помощью файла .gemrc
Параметры могут быть указаны в файле .gemrc. По умолчанию ресурсgem_package будет использовать интерфейс Ruby для установки gem, игнорируя файл .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 при выполнении команды.
-
ignore_failure - Тип Ruby: true, false | Значение по умолчанию:
falseПродолжать выполнение рецепта, если ресурс завершается неудачно по любой причине.
-
notifies - Тип Ruby: Символ, Chef::Resource\[Строка\]
Ресурс может уведомить другой ресурс о действии при изменении его состояния. Укажите
'resource[name]',:actionдействия этого ресурса, а затем:timerэтого действия. Ресурс может уведомить несколько ресурсов; используйте операторnotifiesдля каждого уведомляемого ресурса.Если указанный ресурс не существует, возникает ошибка. В отличие от этого,
subscribesне завершится ошибкой, если исходный ресурс не найден.Таймер указывает момент во время выполнения клиента Chef Infra, в котором выполняется уведомление. Доступны следующие таймеры:
:before-
Указывает, что действие над уведомлённым ресурсом должно быть выполнено до обработки блока ресурса, в котором находится уведомление.
:delayed-
По умолчанию. Указывает, что уведомление должно быть помещено в очередь и выполнено в конце выполнения клиента Chef Infra.
-
: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"}.
-
source - Тип Ruby: Строка
Необязательно. Путь к пакету в локальной файловой системе.
Примечание
Платформа AIX требует, чтобы
sourceбыл локальным путем в файловой системе, потому чтоinstallpне получает пакеты через HTTP или FTP.
-
subscribes - Тип Ruby: Символ, Chef::Resource\[Строка\]
Ресурс может отслеживать другой ресурс и затем предпринять действие, если состояние отслеживаемого ресурса изменится. Укажите
'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, в котором выполняется уведомление. Доступны следующие таймеры:
:before-
Указывает, что действие над уведомлённым ресурсом должно быть выполнено до обработки блока ресурса, в котором находится уведомление.
:delayed-
По умолчанию. Указывает, что уведомление должно быть помещено в очередь и выполнено в конце выполнения клиента Chef Infra.
-
:immediate,:immediately -
Указывает, что уведомление должно быть выполнено немедленно для каждого уведомлённого ресурса.
Синтаксис для
subscribes:subscribes :action, 'resource[name]', :timer
-
timeout - Тип Ruby: Строка, Целое число
Время ожидания в секундах перед истечением срока действия.
-
version - Тип Ruby: Строка, Массив
Версия пакета, который необходимо установить или обновить.
Управление несколькими пакетами
Ресурс может указать несколько пакетов и/или версий для платформ, использующих менеджеры пакетов Apt, Chocolatey, DNF, Homebrew, Pacman или Zypper. Указание нескольких пакетов и/или версий позволяет одной транзакции:
- Загрузить указанные пакеты и версии с помощью одной HTTP-транзакции
- Обновить или установить несколько пакетов с помощью одного ресурса во время выполнения клиента Chef Infra
Например, установка нескольких пакетов:
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
Например, установка нескольких пакетов:
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 воспользуется ресурсом 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, где найти шаблон
sudoers - свойство
variables— это хэш, который передает значения в файлы шаблонов (расположенные в каталогеtemplates/для кулинарной книги)
Используйте оператор case для указания платформы
Следующий пример демонстрирует, как использовать оператор case, чтобы указать клиенту Chef Infra, какие платформы и пакеты установить с помощью 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/