Назад | Перейти на главную страницу

Как мне переопределить некоторые свойства ресурса пакета Chef, не определяя ВСЕ другие свойства?

Я использую Chef для установки пакетов RHEL 5.x на свои узлы. Я, конечно, использую ресурс пакета, вот так

package 'jdk'

Как вы понимаете, у меня ОЧЕНЬ много обращений к ресурсам пакетов в МНОГО кулинарных книг.

По Документация пакета Chef, ресурс имеет свойства retries и retry_delay со значениями по умолчанию 0 и 2 секунды соответственно.

Теперь я хочу изменить это поведение, поэтому повторные попытки через 12 и retry_delay составляют 5 секунд. Теперь я знаю, что могу это сделать

package 'jdk' do
  retries 12
  retry_delay 5
end

Но тогда мне пришлось бы сделать это во ВСЕХ вызовах ресурсов пакета. Как я уже сказал, у меня их МНОГО, поэтому я не обязательно хочу этого делать.

Я начал писать custom_resource, и назовите его, скажем, mycompany_package может это сделать в моем файле mycompany_package / resource / default.rb.

# Package name
property :name, String, required: true, name_property: true
# Retries
property :retries, Integer, required: false, default: 12
# Delay between retries
property :retry_delay, Integer, required: false, default: 5

action :install do
  package name do
    action :install
    retries retries
    retry_delay retry_delay
  end
end

action :remove do
  package name do
    action :remove
  end
end

action :update do
  package name do
    action :update
    retries retries
    retry_delay retry_delay
  end
end

Теперь я могу это сделать

mycompany_package 'jdk'

и я получу 12 повторных попыток и 5 retry_delays. Справедливо.

ОДНАКО это НЕ работает

mycompany_package 'jdk' do
  flush_cache [:before, :after]
end

поскольку mycompany_package НЕ определяет свойство flush_cache. Теперь мне нужно определить ВСЕ свойства ресурса пакета в моей кулинарной книге mycompany_package. Ой!

Итак, как лучше всего переопределить значения retries и retry_delay по умолчанию для ресурса пакета?

LWRP, вероятно, перебор для того, что вы пытаетесь сделать. Следует помнить, что рецепты - это просто Ruby, и любой Ruby, который вы пишете вне блока, выполняется на этапе компиляции. Имея это в виду, вы можете программно генерировать блоки, которые выполняются на этапе схождения.

Самый простой пример решения вашей проблемы - сделать что-то вроде этого:

%w(jdk package2 package3).each do |pkg|
  package pkg do
    retries 12
    retry_delay 5
  end
end

Чтобы пойти дальше, вы можете использовать хэш вместо массива:

{
  'jdk' => {
    'version' => '1.8.0_92',
    'flush_cache' => [:before, :after]
  },
  'package2' => {
    'version' => '1.0.0'
  },
  'package3' => {}
}.each do |pkg,opts|
  package pkg do
    retries 12
    retry_delay 5
    version opts['version'] if opts.has_key? 'version'
    flush_cache opts['flush_cache'] if opts.has_key? 'flush_cache'
  end
end

Вы также можете хранить хэш или массив в атрибутах, но имейте в виду, что атрибуты не являются истинным хешем, они являются мешаниной, и при попытке переопределить атрибуты там есть некоторые проблемы, но это совершенно другое обсуждение.