2017-01-09 6 views
0

Ich habe eine benutzerdefinierte Ressource. Wenn diese Ressource konvergiert, möchte ich die von dieser Ressource installierten Pakete in node.run_state [: installed_packages] speichern. Aber wenn ich später den Wert in einem anderen Rezept (gleicher Client-Lauf) lese, scheint es Null zu sein.Wird node.run_state in chef den gesamten chef-client run überleben?

Mein einziger Gedanke ist, dass das zur Ressourcenerklärungszeit ausgewertet wird? Wenn ja, wie würde ich erreichen, was ich vorhabe?

Hier ist ein Ausschnitt aus meiner benutzerdefinierten Ressource das Element in die run_state setzen:

# 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") 

Und hier ist die Vorlage Ressource ich diese Werte in bin mit:

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 

Antwort

1

Es ist schwer, von zu sagen, nur was du zeigst, aber was du denkst ist "später" ist wahrscheinlich "vorher". Verwenden Sie einen lazy {} Helfer, um die Auswertung des Werts bis später zu verzögern. Weitere Informationen dazu, wann bestimmte Code-Abschnitte passieren, finden Sie unter https://coderanger.net/two-pass/.

+0

Dies ist genau das, was ich brauchte. Für alle anderen, die auf dieses Problem stoßen, ist hier die Dokumentation von Chef auf faul: https://docs.chef.io/resource_common.html#lazy-evaluation –

Verwandte Themen