Пользовательские ресурсы шеф-повара: изменяемое свойство или альтернатива
Я прочитал это по состоянию на 2016
OpsCode рекомендует против LWRP
и альтернатива HWRP
, Они скорее рекомендуют использовать custom resources
,
Хотя это имеет смысл, это оставляет желать лучшего с точки зрения использования рубина (разве я не понял?)
Я хотел бы иметь возможность изменять массив на основе некоторых логических свойств. Затем я могу использовать этот массив для передачи в шаблон, как в:
property :get_iptables_info, [TrueClass, FalseClass], default: false
property :get_pkglist, [TrueClass, FalseClass], default: false
property :cw_logs, Array, default: [], required: false
action :create do
ruby_block 'cw_iptables' do
block do
new_resource.cw_logs.push({ "#{new_resource.custom_dir}/iptables/iptables.txt" => { "log_group_name" => new_resource.log_group_name+"/iptables"}})
end
action :run
only_if {new_resource.get_iptables_info}
end
template "my_template" do
variables ({:logstreams => cw_logs})
end
end
Тогда в моем шаблоне:
<% @logstreams.each_pair do |path, _object| %>
["#{path}"]
log_group_name = _object["log_group_name"]
<% end %>
Проблема в том, что свойства immutable
, Итак, я получаю ошибку:
RuntimeError
------------
ruby_block[cw_iptables] (/tmp/kitchen/cache/cookbooks/custom_cw/resources/logs.rb line 43) had an error: RuntimeError: can't modify frozen Array
Какой правильный способ сделать это? Как правильно написать код ruby внутри ресурса, чтобы он был более модульным и использовался methods/functions
?
1 ответ
Мутирование свойств внутри пользовательского ресурса, как правило, плохая идея (есть исключения, но это не одно из них). Лучше было бы использовать локальную переменную. В связи с этим вам не нужно использовать ruby_block, когда вы уже находитесь в действии пользовательского ресурса:
action :create do
cw_logs = new_resource.cw_logs
if new_resource.get_iptables_info
cw_logs += [whatever extra stuff you want]
end
template "my_template" do
variables logstreams: cw_logs
end
end
Примечательно, что это использует +=
вместо толчка, который не изменяет оригинал. Если вы использовали push
ты бы хотел cw_logs = new_resource.cw_logs.dup
или похожие.