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

Popular posts from this blog

Fail to load namespace Spring Security http://www.springframework.org/security/tags -

sql - MySQL query optimization using coalesce -

Maven Javadoc 'Cannot find default setter' and fails -