Пользовательские ресурсы шеф-повара: изменяемое свойство или альтернатива

Я прочитал это по состоянию на 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 или похожие.

Другие вопросы по тегам