2017-01-09 12 views
0

У меня есть пользовательский ресурс. Когда этот ресурс сходится, я хочу спрятать пакеты, установленные указанным ресурсом, в node.run_state [: installed_packages]. Но когда я перехожу к чтению значения позже в другой рецепт (тот же запуск клиента), он выглядит нулевым.Is node.run_state в шеф-поваре, который должен пережить весь ход шеф-повара?

Моя единственная мысль заключается в том, что это оценивается во время объявления ресурса? Если да, то как мне выполнить то, что я намерен?

Вот отрывок из моего пользовательского ресурса положить деталь в run_state:

# Push the desired package into the run_state 
    if (node.run_state[:installed_packages] == nil) then 
     node.run_state[:installed_packages] = Set.new 
    end 
    node.run_state[:installed_packages].add("/tmp/#{rpm_name}.rpm") 

А вот ресурс шаблона Я использую эти значения в:

template '/tmp/my_script.sh' do 
    source 'my_script.sh.erb' 
    owner 'root' 
    group 'root' 
    mode '0755' 
    variables({ 
     :packages => node.run_state[:installed_packages] || Array.new, 
    }) 

    action :nothing 
end 

ответ

1

Это трудно сказать, из просто то, что вы показываете, но то, что вы думаете, «позже», вероятно, «раньше». Используйте вспомогательный помощник lazy {} для задержки оценки значения до более позднего времени. См. https://coderanger.net/two-pass/ для получения дополнительной информации о том, когда происходят определенные биты кода.

+0

Это именно то, что мне нужно. Для всех, кто сталкивается с этой проблемой, вот документация шефа по ленивым: https://docs.chef.io/resource_common.html#lazy-оценка –