Spec-Zone.ru › Chef 16

Ресурс 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
Ресурс ruby_block
  • Синтаксис
  • Действия
  • Свойства
  • Примеры

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API