Thank you for explanatory response.

I ended up using puppetdbquery 
<https://github.com/dalen/puppet-puppetdbquery#query_resources> instead of 
exported "resources", so I managed to avoid this ordering mess completely.

On Tuesday, January 9, 2018 at 3:05:33 AM UTC+2, Matthew Kennedy wrote:
>
>  
>
> As far as I understand this is not really possible.  This is because you 
> don’t have control over the order of compilation of resources into the 
> catalog. The compiler first evaluates all classes then moves on and 
> eventually has a step that evaluates all collections and so on until the 
> catalog is complete.
>
> You can work around this by ‘bumping scope’ which means you need to get the 
> evaluation of the getparam() to happen after the collection has occurred and 
> the resources are in the catalog.  This is essentially what is happening in 
> your define example.
>
> By bumping scope I mean that you need to do any evaluations in a define that 
> is ‘one scope’ more then then where then resources will be added to the 
> catalog. My scope I mean the order that the compiler will evaluate things.
>
> So when you have a collection in a class the actual collection will happen 
> after all classes are evaluated by the initial pass by the compiler hence why 
> you see the behavior you do.  So if you create a define, use it in the class 
> and have that define evaluate the getparam() then it /might/ work.  Of course 
> you won’t be able to get to those values in your class (because its already 
> been evaluated). I say /might/ work because you can’t be sure that the define 
> you create and the defined type you collected will happen in the right order 
> ie that the collection will happen first. To be sure you can create a second 
> define and use that in the first define and move the evaluation to the new 
> second define.  This is why I call this ‘bumping scope’. At this point the 
> evaluation will happen after the collection’s defined types are in the 
> catalog and getparam() will work.  This get fun when defines make use of 
> defines and the other defines need to reference these 2nd level (or 3rd 
> level) defines.  You can keep adding defines to get things to work. 
>
> Now this looks ugly and is and I feel bad that I’ve done this but it works 
> well and has predictable results. 
>
> Finally the only way I think this can be fixed is it puppet went to a 
> multipass compiler that would ‘reevaluate’ resources if evaluations 
> occurred that reference those resources or their parameters.  This would 
> slow down performance quite and bit and have almost no benefit for most 
> people.
>
> *From: *desertkun <javascript:>
> *Sent: *Monday, January 8, 2018 9:10 AM
> *To: *Puppet Users <javascript:>
> *Subject: *[Puppet Users] Puppet ordering: ensure exported resource to 
> beevaluated BEFORE classes
>
>  
>
> I would like to export "location" information from one node to another. 
> And stuck with that problem for weeks now.
>
>  
>
> In order to achieve that, I use exported resources. Here's the simplified 
> idea:
>
>  
>
> *define *location (*$host*) {
>
>   notify {*"Location being defined **${title}** -> **${host}**"*: }
>
> }
>
>  
>
> # export the location
>
> *node **'a' *{
>
>   @@location { *"mysql-server"*:
>
>     host => *$hostname*
>
>   }
>
> }
>
>  
>
> *node **'b' *{
>
>   # later import it on another node
>
>   Location <<| title == *"mysql-server" *|>>
>
>   # extract the data
>
> *  $mysql_server_host *= getparam(Location[*"mysql-server"*], *"host"*)
>
> }
>
>  
>
> Pretty much I use exported resources as some sort of exported "facts". The 
> problem with that, that puppet cannot realize the Location inside the 
> classes or at node level scope, but does it just fine within resources:
>
>  
>
> *DOES NOT WORK:*
>
>  
>
> *class *class_example() {
>
>   *# something like realize Location["mysql-server"] doesn't even compile*
>
>   Location <<| title == *"mysql-server" *|>>
>
>   *$mysql_server_host *= getparam(Location[*"mysql-server"*], *"host"*)
>
>   notify {*"Example in class: **${mysql_server_host}**"*: }
>
> }
>
>  
>
> *node **'b' *{
>
>   *class *{ class_example: }
>
> }
>
>  
>
> Yields: "Notice: Example in class:"
>
>  
>
> *WORKS JUST FINE:*
>
>  
>
> *define *resource_example() {
>
>   Location <<| title == *"mysql-server" *|>>
>
>   *$mysql_server_host *= getparam(Location[*"mysql-server"*], *"host"*)
>
>   notify {*"Example in resource: **${mysql_server_host}**"*: }
>
> }
>
>  
>
> Yields "Notice: Example in resource: hostname-x"
>
>  
>
> The problem with that, I my guess, the puppet evaluates stuff in two 
> stages, classes first, and then resources, including exported resources. 
> What is also interesting, that notify I've put for debug yields like that:
>
>  
>
> Example in class:
>
> Example in resource: hostname-x
>
> Location being defined mysql-server -> hostname-x
>
>  
>
> If I do "require => Location[*"mysql-server"*]" for the resource, the 
> ordering shows right, but result is the same:
>
>
> Example in class:
>
> Location being defined mysql-server -> hostname-x
>
> Example in resource: hostname-x
>
>  
>
> The question is, how do I enforce puppet to evaluate class AFTER exported 
> resource? Would "stages" help me out here? As a workaround, I have to wrap 
> classes in a single-instance resources.
>
>  
>
> Thank you very much in advance.
>
> -- 
> 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...@googlegroups.com <javascript:>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/puppet-users/e331a5fc-657a-47ae-aa0d-64f2a655ff10%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/puppet-users/e331a5fc-657a-47ae-aa0d-64f2a655ff10%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>
>  
>

-- 
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/19e0c9a6-fa17-444a-a01b-da4941df069a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to