ruby - How to update a node attribute in Chef at converge time? -
i'm trying parse value file in order set attribute use further down recipe (to set subdirectory name).
the file downloaded jenkins server , parsed in ruby block value - far good. however, if try assign node attribute, doesn't work. thought i'd found answer here: how lazily evaluate arbitrary variable chef, none of methods mentioned there work me. doing wrong?
ruby_block "get build number" block f = file.open("/tmp/myappjenkinsbuildinfo.txt") f.each {|line| line_arr = line.split('=') if line_arr[0] == 'jenkins.build.number' node.default['myapp']['jenkins']['build'] = line_arr[1] break end } f.close end end build = delayedevaluator.new { node['myapp']['jenkins']['build'] } release_dir = "#{node['myapp']['dir']['main']}/releases/#{build.call}"
this "works" in there's no syntax error, value of #{build.call} empty string. file exists, , i've tested line_arr[1] inside ruby block getting right value (with puts statement inside rb). i've tried using lambda in place of delayedevaluator.new.
the problem here release_dir =
line getting executed @ compile time, before code in ruby_block
has run. @ point in time, build.call
going return empty string, because code sets node['myapp']['jenkins']['build']
hasn't run yet.
put way, code in recipe getting executed this:
# compile time ruby_block "get build number" block # random stuff here executed @ converge time end end build = delayedevaluator.new { node['myapp']['jenkins']['build'] } release_dir = "#{node['myapp']['dir']['main']}/releases/#{build.call}" # ... # okay, everything's compiled. converge... f = file.open("/tmp/myappjenkinsbuildinfo.txt") f.each {|line| line_arr = line.split('=') if line_arr[0] == 'jenkins.build.number' node.default['myapp']['jenkins']['build'] = line_arr[1] break end } f.close
so answer question, are setting node attribute @ converge time. if way though, have realize it's impossible access variable @ compile time, since @ compile time variable hasn't been set yet. either set variable @ compile time, or don't try accessing until converge time. unfortunately, can't have both.
Comments
Post a Comment