Puppet propagate variable from node to erb template

puppet

Is it possible to declare variable in node and than propage it way down to the erb template?

Example:

node basenode {
  $myvar = "bar" # default
  include myclass
}

node mynode extends basenode {
  $myvar = "foo"
}

class myclass {
  file { "/root/myfile":
    content => template("myclass/mytemplate.erb")
    ensure  => present,
  }
}

Source of mytemplate.erb:

myvar has value: <%= myvar %>

I know that my example might be complicated. But I'm trying to propagate file on (almost) all my nodes and I want its content to be altered depending on the node which requests the file. The $myvar = "bar" statement should be default when node does not override its value.

Is there a solution to my problem? I'm using puppet 0.24.5

Edit: The problem here is probably variable inheritance order. This $myvar variable won't have foo value in mynode node. The solution here would be to include myclass directly in mynode. But I really don't want to do that.
Is there an option to override class variable value after the class has been included?

Best Answer

Puppet node inheritance is not the same as inheritance in most other programming languages . Included classes are evaluated immediatelly when the child is evaluated. And the parent node is evaluated after that. Therefore my example will never work. If you want to know recommended solution for this, read puppet - common misconceptions. I did it this way and it works.

Although I have to admit that I'm pretty disappointed right now, because complex puppet syntax might be confusing for starters.