On Friday, May 18, 2018 at 3:44:24 AM UTC-5, Arnau wrote:
>
> Hi all,
>
> I recently moved from puppet 3 to puppet 5 and hiera 1 to 3. I'm taking 
> this opportunity to change a little bit the hierarchy setup I've been using 
> for the last years.
> In my previous conf I used to create a custom fact for each role so I 
> could do something like:
>
> - "%{environment}/hieradb/role/%{::role}"
>
> and in each role file I specified the classes and any other role bases 
> customizations for the role. So far so good. This approach is something 
> that I'll continue using.
>
>
> But now I'd like to do something similar with profiles: add a custom fact 
> for each profile so I can later use something like:
>
> - "%{environment}/hieradb/profile/%{::profile}"
>
> Obviously this approach does not work when you have more than one profile:
>


Indeed not.
 

>
> First, I'd need to create the profile custom_fact as an array of several 
> profiles and, then, I'd have to tell hiera to look in every profile from 
> the same hierarchy level. In a node with profiles A/B/C hiera should have 
> to look in the files:
>


Indeed, and that's a core problem.  With the standard YAML back-end, every 
hierarchy level maps to at most one data file.
 

>
> "%{environment}/hieradb/profile/profileA.yaml" 
> "%{environment}/hieradb/profile/profileB.yaml" 
> "%{environment}/hieradb/profile/profileC.yaml" 
>
> Based on my tests (yup, I tried this) if hiera finds the value in, let's 
> say, profileB.yaml it stops scanning this level and profileC.yaml is not 
> evaluated.
>


I find that doubtful.  Given the hierarchy definition you specified 
earlier, I expect Hiera to read at most one of those files whether it finds 
the value there or not.

 

> In any case, even if hiera continues scanning all files in the same lelve, 
> this approach will create a conflic in hiera itself whenever it finds the 
> same variable defined in 2 profiles. ¿Which one should I choose?
>


For data at different hierarchy levels, this is where Hiera's various merge 
behaviors come into play.  The default is that the first value found is 
used, but you can instead collect all values into an array, or, for hashes, 
merge the various hashes in one of two ways.

But note well that if you have different profiles trying to specify values 
for the same data then that's a serious conflict that you need to work out 
-- a data design problem, not inherently an Hiera problem.

 

> So, the (obvious) solution is to move any profile customization to the 
> role level, the same I've been doing till now.
> But I was wondering if some part of my approach could be possible (without 
> having to decalre all the possible profiles in my hiera  tree) or if 
> someone was somehow using the "profile" in the hiera tree (and how)?.
>


You can parameterize your profile classes, and then rely on standard data 
binding to obtain the values from Hiera.  The data for different profiles 
are then distinguished by different keys, and they can appear at any 
Hierarchy level.

For data that you want to share among profiles without duplication, you can 
define well-known keys and explicitly call the lookup() function in each 
profile to retrieve the (same) associated data.  Or you can define a 
separate class to host the variables, set their values via automated data 
binding, and have all the profiles that want access obtain it via that one 
class.  Either way, again, the data can then appear at any hierarchy level.

If this is about class parameters for the classes your profiles use, then 
you could perhaps risk having the profiles declare those with resource-like 
class declarations (instead of include-like ones), whereby you can bind 
data to the classes' parameters via DSL code.


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/4bbe8b7e-a15f-4f39-b804-fbe26bcb118b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to