Wolf Noble
2012-Jun-12 18:48 UTC
[Puppet Users] "Best" way to relate keys, or stuff multiple values into a single key in hiera?
So… I''m coming across a situation where I foresee myself having a collection of related k/v pairs in hiera. I want to create a thing… lets say a yumrepo for example''s sake, but this same idea translates to a vhost, a web app configuration , a virtual domain, etc. lets assume a hierarchy of: - %{region}/%{dc}/%{env}/%{function}/%{fqdn} - %{region}/%{dc}/%{env}/%{function}/common - %{region}/%{dc}/%{env}/common - %{region}/%{dc}/common - %{region}/common in the us-east region common yaml file, should I create the following two repos values: repo_descr: eastcoast-pub repo_baseurl: http://myfoo.com/eastcoastgoodtimes repo_gpgkey: http://myfoo.com/eastcoastgoodtimes/key repo_gpgcheck: 1 repo_enabled: 1 repo_enablegroups: 0 repo_descr: eastcoast-internal repo_baseurl: http://myfoo.com/eastcoast repo_gpgkey: http://myfoo.com/eastcoast/key repo_gpgcheck: 1 repo_enabled: 1 repo_enablegroups: 0 in the foo DC common file I have a repo for that datacenter: repo_descr: foo repo_baseurl: http://myfoo.com/goodtimes repo_gpgkey: http://myfoo.com/goodtimes/key repo_gpgcheck: 1 repo_enabled: 1 repo_enablegroups: 0 in the ''qa'' env common yaml file repo_descr: fooqarepo repo_baseurl: http://myfoo.com/qa_crispybacon/goodtimes repo_gpgkey: http://myfoo.com/qa_crispybacon/goodtimes/key repo_gpgcheck: 1 repo_enabled: 1 repo_enablegroups: 0 in the webservers function common yaml file, I have another repo: repo_descr: webservers repo_baseurl: http://myfoo.com/bacon/goodtimes repo_gpgkey: http://myfoo.com/bacon/goodtimes/key repo_gpgcheck: 1 repo_enabled: 1 repo_enablegroups: 0 so I want all the qa web servers in the foo DC in the east coast to have all five of those repo files defined.. except for web02, of course, because he''s special… looking at it this way makes my head hurt. I don''t see a good way to actualize these repos onto a node, or exclude them from a unique snowflake if necessary, which sort-of defeats the purpose of hiera altogether. Do I not create them as separate keys, but as a single ''repo'' array, and in my manifest use a template to iterate through the array and associate the values contained within the array with values needed for the addition of a repo? What have people found works "best"? ________________________________ This message may contain confidential or privileged information. If you are not the intended recipient, please advise us immediately and delete this message. See http://www.datapipe.com/legal/email_disclaimer/ for further information on confidentiality and the risks of non-secure electronic communication. If you cannot access these links, please notify us by reply message and we will send the contents to you. -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.
jcbollinger
2012-Jun-12 22:18 UTC
[Puppet Users] Re: "Best" way to relate keys, or stuff multiple values into a single key in hiera?
On Tuesday, June 12, 2012 1:48:09 PM UTC-5, Wolf Noble wrote:> > So… I''m coming across a situation where I foresee myself having a > collection of related k/v pairs in hiera. I want to create a thing… lets > say a yumrepo for example''s sake, but this same idea translates to a > vhost, a web app configuration , a virtual domain, etc. > > lets assume a hierarchy of: > > - %{region}/%{dc}/%{env}/%{function}/%{fqdn} > - %{region}/%{dc}/%{env}/%{function}/common > - %{region}/%{dc}/%{env}/common > - %{region}/%{dc}/common > - %{region}/common > > in the us-east region common yaml file, should I create the following two > repos values: > > repo_descr: eastcoast-pub > repo_baseurl: http://myfoo.com/eastcoastgoodtimes > repo_gpgkey: http://myfoo.com/eastcoastgoodtimes/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > repo_descr: eastcoast-internal > repo_baseurl: http://myfoo.com/eastcoast > repo_gpgkey: http://myfoo.com/eastcoast/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > > in the foo DC common file I have a repo for that datacenter: > > repo_descr: foo > repo_baseurl: http://myfoo.com/goodtimes > repo_gpgkey: http://myfoo.com/goodtimes/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > > > in the ''qa'' env common yaml file > > repo_descr: fooqarepo > repo_baseurl: http://myfoo.com/qa_crispybacon/goodtimes > repo_gpgkey: http://myfoo.com/qa_crispybacon/goodtimes/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > > > in the webservers function common yaml file, I have another repo: > > repo_descr: webservers > repo_baseurl: http://myfoo.com/bacon/goodtimes > repo_gpgkey: http://myfoo.com/bacon/goodtimes/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > > > > > > so I want all the qa web servers in the foo DC in the east coast to have > all five of those repo files defined.. except for web02, of course, because > he''s special… looking at it this way makes my head hurt. I don''t see a good > way to actualize these repos onto a node, or exclude them from a unique > snowflake if necessary, which sort-of defeats the purpose of hiera > altogether. > > Do I not create them as separate keys, but as a single ''repo'' array, and > in my manifest use a template to iterate through the array and associate > the values contained within the array with values needed for the addition > of a repo? > > What have people found works "best"? >For complex data you need to put some structure in your YAML and process it accordingly in your manifests. In particular, in this case it would be to your advantage to use hiera''s (and YAML''s) support for arrays and / or hashes as values. For example: in us-east/common.yaml: =====region_repos: eastcoast_pub_repo: { descr: eastcoast-pub, baseurl: http://myfoo.com/eastcoastgoodtimes, gpgkey: http://myfoo.com/eastcoastgoodtimes/key, gpgcheck: 1, enabled: 1, enablegroups: 0 }, eastcoast_internal_repo: { descr: eastcoast-internal, baseurl: http://myfoo.com/eastcoast, gpgkey: http://myfoo.com/eastcoast/key, gpgcheck: 1, enabled: 1, enablegroups: 0 } ===== That''s a hash of hashes, associated with the key "region_repos". You could use that in your manifests like so: mymodule::repos { create_resources(''yumrepo'', hiera(''region_repos'')) # perhaps also create_resources(''yumrepo'', hiera(''dc_repos'')), etc. } If that looks simple, that''s because I tailored the YAML data structure to the expectations of the create_resources() function. It''s also because the structure assumes that you will explicitly load the data for each hierarchy level you want, instead of, for example, using hiera_array() or hiera_hash() to assemble an even more complex aggregate data structure from various levels of your hierarchy. I think that''s reasonable for your use case, especially given that you anticipate certain machines will need exceptions. You''re still getting indirection out of it because hiera is choosing the appropriate region-, dc-, and environment-specific data files. There are many other ways to do it, but that one has the advantage of being simple (relatively speaking) and fairly easy to understand. John -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To view this discussion on the web visit https://groups.google.com/d/msg/puppet-users/-/Rug-iffTkLkJ. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.
Wolf Noble
2012-Jun-12 22:51 UTC
Re: [Puppet Users] Re: "Best" way to relate keys, or stuff multiple values into a single key in hiera?
Hi John, Thanks a bunch. This seems incredibly sensible. If I''m understanding your suggestion properly, I interpret the best thing to do as something like: mymodule::repos { $region_repos = hiera(''region_repos'' , '''' ) $dc_repos = hiera(''dc_repos'' , '''' ) if $region_repos { create_resources(''yumrepo'', $region_repos)) } if $dc_repos { create_resources(''yumrepo'', $dc_repos)) } #... } and then I could override them like us-east/foo/qa/webservers/web02.qa.myfoo.com.yaml region_repos: "" dc_repos: foodc_qa_repo: { descr: foodc-qa, baseurl: http://myfoo.com/foodc-repo, gpgkey: http://myfoo.com/foodcrepo/key, gpgcheck: 1, enabled: 1, enablegroups: 0 } with the known caveat that I''d have to explicitly redeclare the entire hash at the most relevant tier if I wanted to change any element of the hash already defined. Did I miss anything? On Jun 12, 2012, at 5:18 PM, jcbollinger wrote:> > > On Tuesday, June 12, 2012 1:48:09 PM UTC-5, Wolf Noble wrote: > So… I''m coming across a situation where I foresee myself having a collection of related k/v pairs in hiera. I want to create a thing… lets say a yumrepo for example''s sake, but this same idea translates to a vhost, a web app configuration , a virtual domain, etc. > > lets assume a hierarchy of: > > - %{region}/%{dc}/%{env}/%{function}/%{fqdn} > - %{region}/%{dc}/%{env}/%{function}/common > - %{region}/%{dc}/%{env}/common > - %{region}/%{dc}/common > - %{region}/common > > in the us-east region common yaml file, should I create the following two repos values: > > repo_descr: eastcoast-pub > repo_baseurl: http://myfoo.com/eastcoastgoodtimes > repo_gpgkey: http://myfoo.com/eastcoastgoodtimes/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > repo_descr: eastcoast-internal > repo_baseurl: http://myfoo.com/eastcoast > repo_gpgkey: http://myfoo.com/eastcoast/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > > in the foo DC common file I have a repo for that datacenter: > > repo_descr: foo > repo_baseurl: http://myfoo.com/goodtimes > repo_gpgkey: http://myfoo.com/goodtimes/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > > > in the ''qa'' env common yaml file > > repo_descr: fooqarepo > repo_baseurl: http://myfoo.com/qa_crispybacon/goodtimes > repo_gpgkey: http://myfoo.com/qa_crispybacon/goodtimes/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > > > in the webservers function common yaml file, I have another repo: > > repo_descr: webservers > repo_baseurl: http://myfoo.com/bacon/goodtimes > repo_gpgkey: http://myfoo.com/bacon/goodtimes/key > repo_gpgcheck: 1 > repo_enabled: 1 > repo_enablegroups: 0 > > > > > > > so I want all the qa web servers in the foo DC in the east coast to have all five of those repo files defined.. except for web02, of course, because he''s special… looking at it this way makes my head hurt. I don''t see a good way to actualize these repos onto a node, or exclude them from a unique snowflake if necessary, which sort-of defeats the purpose of hiera altogether. > > Do I not create them as separate keys, but as a single ''repo'' array, and in my manifest use a template to iterate through the array and associate the values contained within the array with values needed for the addition of a repo? > > What have people found works "best"? > > For complex data you need to put some structure in your YAML and process it accordingly in your manifests. In particular, in this case it would be to your advantage to use hiera''s (and YAML''s) support for arrays and / or hashes as values. For example: > > in us-east/common.yaml: > =====> region_repos: > eastcoast_pub_repo: { > descr: eastcoast-pub, > baseurl: http://myfoo.com/eastcoastgoodtimes, > gpgkey: http://myfoo.com/eastcoastgoodtimes/key, > gpgcheck: 1, > enabled: 1, > enablegroups: 0 > }, > eastcoast_internal_repo: { > descr: eastcoast-internal, > baseurl: http://myfoo.com/eastcoast, > gpgkey: http://myfoo.com/eastcoast/key, > gpgcheck: 1, > enabled: 1, > enablegroups: 0 > } > =====> > That''s a hash of hashes, associated with the key "region_repos". You could use that in your manifests like so: > > mymodule::repos { > create_resources(''yumrepo'', hiera(''region_repos'')) > # perhaps also create_resources(''yumrepo'', hiera(''dc_repos'')), etc. > } > > If that looks simple, that''s because I tailored the YAML data structure to the expectations of the create_resources() function. > > It''s also because the structure assumes that you will explicitly load the data for each hierarchy level you want, instead of, for example, using hiera_array() or hiera_hash() to assemble an even more complex aggregate data structure from various levels of your hierarchy. I think that''s reasonable for your use case, especially given that you anticipate certain machines will need exceptions. You''re still getting indirection out of it because hiera is choosing the appropriate region-, dc-, and environment-specific data files. > > There are many other ways to do it, but that one has the advantage of being simple (relatively speaking) and fairly easy to understand. > > > John > > > -- > You received this message because you are subscribed to the Google Groups "Puppet Users" group. > To view this discussion on the web visit https://groups.google.com/d/msg/puppet-users/-/Rug-iffTkLkJ. > To post to this group, send email to puppet-users@googlegroups.com. > To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.________________________________ This message may contain confidential or privileged information. If you are not the intended recipient, please advise us immediately and delete this message. See http://www.datapipe.com/legal/email_disclaimer/ for further information on confidentiality and the risks of non-secure electronic communication. If you cannot access these links, please notify us by reply message and we will send the contents to you. -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.
jcbollinger
2012-Jun-13 13:24 UTC
Re: [Puppet Users] Re: "Best" way to relate keys, or stuff multiple values into a single key in hiera?
On Tuesday, June 12, 2012 5:51:06 PM UTC-5, Wolf Noble wrote:> > Hi John, > > Thanks a bunch. This seems incredibly sensible. > > If I''m understanding your suggestion properly, I interpret the best thing > to do as something like: > > > mymodule::repos { > $region_repos = hiera(''region_repos'' , '''' ) > $dc_repos = hiera(''dc_repos'' , '''' ) > > if $region_repos { > create_resources(''yumrepo'', $region_repos)) > } > if $dc_repos { > create_resources(''yumrepo'', $dc_repos)) > } > #... > } > > and then I could override them like > > us-east/foo/qa/webservers/web02.qa.myfoo.com.yaml > > region_repos: "" > dc_repos: > foodc_qa_repo: { > descr: foodc-qa, > baseurl: http://myfoo.com/foodc-repo, > gpgkey: http://myfoo.com/foodcrepo/key, > gpgcheck: 1, > enabled: 1, > enablegroups: 0 > } > > > with the known caveat that I''d have to explicitly redeclare the entire > hash at the most relevant tier if I wanted to change any element of the > hash already defined. > > > Did I miss anything? >I don''t see any obvious errors or omissions. In particular, you are correct that overriding repos declared at a lower level will involve declaring an entirely new hash (of hashes) at the appropriate higher level. That''s one of the costs attending complex data. All in all, it looks nicely fleshed out. John -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To view this discussion on the web visit https://groups.google.com/d/msg/puppet-users/-/Ts3RcypLci0J. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.
Wolf Noble
2012-Jun-13 15:21 UTC
Re: [Puppet Users] Re: "Best" way to relate keys, or stuff multiple values into a single key in hiera?
Awesome! I wonder about one other thing though, Is create_resources likely to balk if there are values in the hash that are irrelevant for the resource type being fed? ie: if I have a region_repos hash that has both yum values, and apt values… (assuming that a debian sibling to the yumrepo type comes along at some point in the future) and feed them both via the same key, is that likely going to cause me pain? or should the key be geared more to one or the other, i.e.: region_yumrepo: foo_repo: { .. } region_aptsource foo_aptsource: { … } just trying to think about where the pointy/sharp parts of this might be. On Jun 13, 2012, at 8:24 AM, jcbollinger wrote:> > > On Tuesday, June 12, 2012 5:51:06 PM UTC-5, Wolf Noble wrote: > Hi John, > > Thanks a bunch. This seems incredibly sensible. > > If I''m understanding your suggestion properly, I interpret the best thing to do as something like: > > > mymodule::repos { > $region_repos = hiera(''region_repos'' , '''' ) > $dc_repos = hiera(''dc_repos'' , '''' ) > > if $region_repos { > create_resources(''yumrepo'', $region_repos)) > } > if $dc_repos { > create_resources(''yumrepo'', $dc_repos)) > } > #... > } > > and then I could override them like > > us-east/foo/qa/webservers/web02.qa.myfoo.com.yaml > > region_repos: "" > dc_repos: > foodc_qa_repo: { > descr: foodc-qa, > baseurl: http://myfoo.com/foodc-repo, > gpgkey: http://myfoo.com/foodcrepo/key, > gpgcheck: 1, > enabled: 1, > enablegroups: 0 > } > > > with the known caveat that I''d have to explicitly redeclare the entire hash at the most relevant tier if I wanted to change any element of the hash already defined. > > > Did I miss anything? > > I don''t see any obvious errors or omissions. In particular, you are correct that overriding repos declared at a lower level will involve declaring an entirely new hash (of hashes) at the appropriate higher level. That''s one of the costs attending complex data. All in all, it looks nicely fleshed out. > > > John > > > -- > You received this message because you are subscribed to the Google Groups "Puppet Users" group. > To view this discussion on the web visit https://groups.google.com/d/msg/puppet-users/-/Ts3RcypLci0J. > To post to this group, send email to puppet-users@googlegroups.com. > To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.________________________________ This message may contain confidential or privileged information. If you are not the intended recipient, please advise us immediately and delete this message. See http://www.datapipe.com/legal/email_disclaimer/ for further information on confidentiality and the risks of non-secure electronic communication. If you cannot access these links, please notify us by reply message and we will send the contents to you. -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.
jcbollinger
2012-Jun-14 13:02 UTC
Re: [Puppet Users] Re: "Best" way to relate keys, or stuff multiple values into a single key in hiera?
On Wednesday, June 13, 2012 10:21:19 AM UTC-5, Wolf Noble wrote:> > I wonder about one other thing though, Is create_resources likely to balk > if there are values in the hash that are irrelevant for the resource type > being fed? >I don''t know off-hand, but I wouldn''t be at all surprised if create_resources() fails when its input contains mappings for properties that the target resource type does not actually have. If you put such additional data into your repository structure then you''ll probably need to process the result to select the desired portions before feeding it to create_resources(). You might need to write a custom function for that purpose. Alternatively, you could associate data for different resource types with different hiera keys. John -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To view this discussion on the web visit https://groups.google.com/d/msg/puppet-users/-/sZuRX4_F_BYJ. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.