On Thursday, October 29, 2015 at 1:05:16 AM UTC-5, Jakov Sosic wrote: > > Hi guys. > > I have an issue with scope changes, and I am wondering how to proceed. > > > This is what I've got: > > define first ( > $somevar, > ) { > $name_array = split($title, '/') > $developer = $name_array[0] > $instance = $name_array[1] > > ::second { "${developer}_${instance}": > template => 'my/custom/file.erb', > } > > } > > > define second ( > $template, > ) { > notify { "${developer}": } > } > > first { 'j/test': somevar => 'test' } > > > Accessing $developer was working before updating to puppet4, but after > updating, it's not working any more. ERBs that are inside 'second' are > depending on these variables being available to evaluate correctly.
What you describe should not have worked in Puppet 3, either. Class inheritance is the only mechanism Puppet 3 scoping rules <https://docs.puppetlabs.com/puppet/3/reference/lang_scope.html> provide for variables declared in a local scope, such as is established by the body of a class or a defined type, to be visible in any other scope. Defined types are not subject to class inheritance. I'm reasonably confident that the example you provided would create a Notify with an empty message in Puppet 3, but since you mention templates, there was a bug in Puppet 3 in which templates were able to access variables via dynamic scope (PUP-1220) <https://tickets.puppetlabs.com/browse/PUP-1220>. That would explain the template behavior you describe. As far as I know or can tell, scoping rules are unchanged in Puppet 4. The fix for PUP-1220 was initially rolled out in Puppet 3.5.0, but only in the future parser. In Puppet 4, the erstwhile future parser is the only parser. > > I know a clean way to fix this would be to pass a variable $developer as > a parameter to second defined type. BUT, I would like to try and avoid > that because 'second' is a defined type provided by 3rd party module. > > > Is there anything else I can do? > There is nothing you can do to cause a variable declared in one defined type's local scope to be visible in a different defined type. You can pass its *value* if you modify the second defined type, but you say you don't want to do that. The only other avenues I see would involve modifying the template, or using a different means to specify the target file's content, or taking a step back and performing a broader redesign. I'm afraid I can't suggest any details, however, because you've completely abstracted away what you're actually trying to achieve. John -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-users/7c0adc47-4dcc-4932-8494-5c6f39a6599e%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.