Ресурс ruby_block
Эта страница сгенерирована из исходного кода Chef. Чтобы предложить изменения, отредактируйте файл ruby_block.rb и отправьте запрос на добавление в репозиторий Chef.
Используйте ресурс ruby_block для выполнения кода Ruby во время работы Chef Infra Client. Код Ruby в ruby_block ресурсе оценивается вместе с другими ресурсами во время схождения, в то время как код Ruby вне ruby_block ресурса оценивается до других ресурсов, по мере компиляции рецепта.
Синтаксис
Блок ресурса ruby_block выполняет блок произвольного кода Ruby. Например, чтобы перезагрузить файл client.rb во время работы Chef Infra Client:
ruby_block 'reload_client_config' do
block do
Chef::Config.from_file("/etc/chef/client.rb")
end
action :run
end
Полный синтаксис всех доступных свойств ресурса ruby_block:
ruby_block 'name' do
block Block
block_name String # defaults to 'name' if not specified
action Symbol # defaults to :run if not specified
endгде:
-
ruby_block— это ресурс. -
name— имя, присвоенное блоку ресурса. -
block— блок кода Ruby, который должен быть выполнен. -
actionопределяет действия, которые Chef Infra Client выполнит для приведения узла к желаемому состоянию. -
blockиblock_name— свойства этого ресурса, с указанием типа Ruby. Дополнительную информацию обо всех свойствах, которые можно использовать с этим ресурсом, см. в разделе «Свойства» ниже.
Действия
Ресурс ruby_block имеет следующие действия:
:create- То же, что и
:run. :nothing- Этот блок ресурса не действует, пока не будет уведомлен другим ресурсом о выполнении действия. После уведомления этот блок ресурса либо выполняется немедленно, либо помещается в очередь для выполнения в конце работы Chef Infra Client.
:run- По умолчанию. Выполняет блок Ruby.
Свойства
Ресурс ruby_block имеет следующие свойства:
block-
Тип Ruby: Блок
Блок кода Ruby.
block_name-
Тип Ruby: Строка | Значение по умолчанию:
The resource block's nameИмя блока Ruby. Значение по умолчанию: имя
nameблока ресурса. Дополнительную информацию см. в разделе «Синтаксис» выше.
ignore_failure-
Тип Ruby: true, false | Значение по умолчанию:
falseПродолжать выполнение рецепта, если ресурс потерпит неудачу по любой причине.
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
retries-
Тип Ruby: Целое число | Значение по умолчанию:
0Количество попыток перехватить исключения и повторить ресурс.
retry_delay-
Тип Ruby: Целое число | Значение по умолчанию:
2Задержка повтора (в секундах).
subscribes-
Тип Ruby: Символ, Chef::Resource\[String\]
Ресурс может слушать другой ресурс и затем выполнить действие, если состояние ресурса, за которым он следит, изменится. Укажите
'resource[name]', действие, которое должно быть выполнено, и затем: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
Примеры
Следующие примеры демонстрируют различные подходы к использованию ресурса ruby_block в рецептах:
Перечитывание конфигурационных данных
ruby_block 'reload_client_config' do
block do
Chef::Config.from_file('/etc/chef/client.rb')
end
action :run
end
Установка репозиториев из файла, запуск команды и принудительная перезагрузка внутреннего кэша
Следующий пример показывает, как установить новые репозитории Yum из файла, где установка репозитория запускает создание кэша Yum, что принудительно перезагружает внутренний кэш Chef Infra Client:
execute 'create-yum-cache' do
command 'yum -q makecache'
action :nothing
end
ruby_block 'reload-internal-yum-cache' do
block do
Chef::Provider::Package::Yum::YumCache.instance.reload
end
action :nothing
end
cookbook_file '/etc/yum.repos.d/custom.repo' do
source 'custom'
mode '0755'
notifies :run, 'execute[create-yum-cache]', :immediately
notifies :create, 'ruby_block[reload-internal-yum-cache]', :immediately
end
Использование оператора if с методом платформы Recipe DSL
Следующий пример показывает, как оператор if можно использовать с методом platform? в DSL рецепта для выполнения кода, специфичного для Microsoft Windows. Код определяется с помощью ресурса ruby_block:
# the following code sample comes from the ``client`` recipe
# in the following cookbook: https://github.com/chef-cookbooks/mysql
if platform?('windows')
ruby_block 'copy libmysql.dll into ruby path' do
block do
require 'fileutils'
FileUtils.cp "#{node['mysql']['client']['lib_dir']}\\libmysql.dll",
node['mysql']['client']['ruby_dir']
end
not_if { File.exist?("#{node['mysql']['client']['ruby_dir']}\\libmysql.dll") }
end
end
Хранение файла в пакете данных
Следующий пример демонстрирует использование ресурса ruby_block для хранения файла BitTorrent в пакете данных, чтобы его можно было распространить на узлы в организации.
# the following code sample comes from the ``seed`` recipe
# in the following cookbook: https://github.com/mattray/bittorrent-cookbook
ruby_block 'share the torrent file' do
block do
f = File.open(node['bittorrent']['torrent'],'rb')
#read the .torrent file and base64 encode it
enc = Base64.encode64(f.read)
data = {
'id'=>bittorrent_item_id(node['bittorrent']['file']),
'seed'=>node.ipaddress,
'torrent'=>enc
}
item = Chef::DataBagItem.new
item.data_bag('bittorrent')
item.raw_data = data
item.save
end
action :nothing
subscribes :create, "bittorrent_torrent[#{node['bittorrent']['torrent']}]", :immediately
end
Обновление файла /etc/hosts
Следующий пример демонстрирует, как ресурс ruby_block можно использовать для обновления файла /etc/hosts:
# the following code sample comes from the ``ec2`` recipe
# in the following cookbook: https://github.com/chef-cookbooks/dynect
ruby_block 'edit etc hosts' do
block do
rc = Chef::Util::FileEdit.new('/etc/hosts')
rc.search_file_replace_line(/^127\.0\.0\.1 localhost$/,
'127.0.0.1 #{new_fqdn} #{new_hostname} localhost')
rc.write_file
end
end
Установка переменных среды
Следующий пример показывает, как использовать переменные внутри блока Ruby для установки переменных среды с помощью rbenv.
node.override[:rbenv][:root] = rbenv_root
node.override[:ruby_build][:bin_path] = rbenv_binary_path
ruby_block 'initialize' do
block do
ENV['RBENV_ROOT'] = node[:rbenv][:root]
ENV['PATH'] = "#{node[:rbenv][:root]}/bin:#{node[:ruby_build][:bin_path]}:#{ENV['PATH']}"
end
end
Установка JAVA_HOME
Следующий пример показывает, как использовать переменную внутри блока Ruby для установки переменной среды java_home:
ruby_block 'set-env-java-home' do
block do
ENV['JAVA_HOME'] = java_home
end
end
Выполнение определенных блоков кода Ruby на определенных платформах
Следующий пример показывает, как метод platform? и оператор if могут использоваться в рецепте вместе с ресурсом ruby_block для выполнения определенных блоков кода Ruby на определенных платформах:
if platform_family?('debian', 'rhel', 'fedora', 'amazon')
ruby_block 'update-java-alternatives' do
block do
if platform?('ubuntu', 'debian') and version == 6
run_context = Chef::RunContext.new(node, {})
r = Chef::Resource::Execute.new('update-java-alternatives', run_context)
r.command 'update-java-alternatives -s java-6-openjdk'
r.returns [0,2]
r.run_action(:create)
else
require 'fileutils'
arch = node['kernel']['machine'] =~ /x86_64/ ? 'x86_64' : 'i386'
Chef::Log.debug("glob is #{java_home_parent}/java*#{version}*openjdk*")
jdk_home = Dir.glob("#{java_home_parent}/java*#{version}*openjdk{,[-\.]#{arch}}")[0]
Chef::Log.debug("jdk_home is #{jdk_home}")
if File.exist? java_home
FileUtils.rm_f java_home
end
FileUtils.ln_sf jdk_home, java_home
cmd = Chef::ShellOut.new(
%Q[ update-alternatives --install /usr/bin/java java #{java_home}/bin/java 1;
update-alternatives --set java #{java_home}/bin/java ]
).run_command
unless cmd.exitstatus == 0 or cmd.exitstatus == 2
Chef::Application.fatal!('Failed to update-alternatives for openjdk!')
end
end
end
action :nothing
end
end
Перезагрузка конфигурации
Следующий пример показывает, как перезагрузить конфигурацию chef-client с использованием ресурса 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
© 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/ruby_block/