Я использую 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
Вы также можете хранить хэш или массив в атрибутах, но имейте в виду, что атрибуты не являются истинным хешем, они являются мешаниной, и при попытке переопределить атрибуты там есть некоторые проблемы, но это совершенно другое обсуждение.