Template source dependent on an attribute set


Basic syntax issue

I posted a question similar to this for controlling template contents but wanted to know if i can further this to select template source.


default['app']['version2'] = true


template node['app'][version]['path']  do
  <% if node['app']['version2'] -%>
    source 'file_version2.erb'
  <% end -%>
  source 'file.erb'
  local false

I had hoped this would select file.erb as the source of the template unless ‘version2’ is set to ‘true’ which would then use source file_version2.erb

Currently errors with -

syntax error, unexpected tIDENTIFIER, expecting keyword_end

<% if node['app']['version2'] -%>
^ under first [

keyword_end - missing a close bracket??

hopefully something obvious …

many thanks

You can’t put ERB inside a recipe, but you can put pure ruby. There are multiple ways to make an attribute conditional, assuming that node['app']['version2'] will never change mid chef run, you could try something like this

template node['app'][version]['path']  do
  source 'file_version2.erb' if node['app']['version2']
  source 'file.erb' unless node['app']['version2']
  local false

Or another way that is a little more verbose but easier to read.

node.run_state['version'] = ''
node.run_state['version'] = '_version2' if node['app']['version2']

template node['app'][version]['path']  do
  source "file#{node.run_state['version']}.erb"
  local false

If the node['app']['version2'] could ever change mid chef run, then it would be better to put this in a custom resource or use lazy interpolation.

thanks a lot for your response - that makes a lot of sense and will use shortly.