tek-ops
2008-Oct-30 21:46 UTC
[Puppet Users] Templating to set variables based on environment
I''m attempting to use templating so that I can have variables in all config files for the aspects that vary solely based on which environment is in question. The benefit is that the only differences in the configurations between my environments are those being tested. This also eliminates the chance for human error; say leaving in host''s domain names of the qa environment when roll out new configurations to staging. How I initially wanted to perform this was to have a class for each environment to statically configure the variables in question in a single location. However, including this class at the node level didn''t translate those values down to the template level. Here''s an example of replacing puppet.conf for each environment with a template: Snippet from puppet.erb template -------------------------------------------------------------------------------- [puppetd] # Set by template server = <%= puppetserver %> environment = <%= environment %> -------------------------------------------------------------------------------- $environment is already a value known, however I''m creating the variable $puppetserver and trying to set it in one location. How I wanted to get this to work was to do something like this: -------------------------------------------------------------------------------- # templates.pp class qa_env { $puppetserver = "puppet.qa.domain" } class stage_env { $puppetserver = "puppet.stage.domain" } class prod_env { $puppetserver = "puppet.prod.domain" } -------------------------------------------------------------------------------- And thus each node would just "include" the appropriate class. This however does not work, so here is my work around. I created a single class to set each variable based on which environment the node in question happens to fall into. -------------------------------------------------------------------------------- # templates.pp class env_set { $puppetserver = $environment ? { qa => "puppet.qa.domain", stage => "puppet.stageg.domain", prod => "puppet.prod.domain", } } -------------------------------------------------------------------------------- The only problem is that in each node I not only include this class but also have to pull each variable up to the nodes scope for it''s templates to be able to get values for these variables, as you see here: -------------------------------------------------------------------------------- # nodes.pp node "web-1" { include "env_set" $puppetserver = $env_set::puppetserver include "puppet::client" } node "web-2" { include "env_set" $puppetserver = $env_set::puppetserver include "puppet::client" } -------------------------------------------------------------------------------- This is fine for just a few variables, but it is going to get unmanagable as the number of nodes increases as well as the number of variables needed. Is there a better way to do this? --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
tek-ops
2008-Oct-31 16:19 UTC
[Puppet Users] Re: Templating to set variables based on environment
What would really help is if there was a node definition like "default" that was used by all nodes, not just ones that are otherwise not defined. Although this "may" have the same scope issue of resolving this with a class. On Oct 30, 5:46 pm, tek-ops <msche...@gmail.com> wrote:> I''m attempting to use templating so that I can have variables in all > config files for the aspects that vary solely based on which > environment is in question. The benefit is that the only differences > in the configurations between my environments are those being tested. > This also eliminates the chance for human error; say leaving in host''s > domain names of the qa environment when roll out new configurations to > staging. > > How I initially wanted to perform this was to have a class for each > environment to statically configure the variables in question in a > single location. However, including this class at the node level > didn''t translate those values down to the template level. Here''s an > example of replacing puppet.conf for each environment with a template: > > Snippet from puppet.erb template > -------------------------------------------------------------------------------- > [puppetd] > # Set by template > server = <%= puppetserver %> > environment = <%= environment %> > -------------------------------------------------------------------------------- > > $environment is already a value known, however I''m creating the > variable $puppetserver and trying to set it in one location. How I > wanted to get this to work was to do something like this: > -------------------------------------------------------------------------------- > # templates.pp > > class qa_env { > $puppetserver = "puppet.qa.domain" > > } > > class stage_env { > $puppetserver = "puppet.stage.domain" > > } > > class prod_env { > $puppetserver = "puppet.prod.domain"} > > -------------------------------------------------------------------------------- > And thus each node would just "include" the appropriate class. This > however does not work, so here is my work around. > > I created a single class to set each variable based on which > environment the node in question happens to fall into. > -------------------------------------------------------------------------------- > # templates.pp > > class env_set { > $puppetserver = $environment ? { > qa => "puppet.qa.domain", > stage => "puppet.stageg.domain", > prod => "puppet.prod.domain", > }} > > -------------------------------------------------------------------------------- > > The only problem is that in each node I not only include this class > but also have to pull each variable up to the nodes scope for it''s > templates to be able to get values for these variables, as you see > here: > -------------------------------------------------------------------------------- > # nodes.pp > > node "web-1" { > include "env_set" > $puppetserver = $env_set::puppetserver > > include "puppet::client" > > } > > node "web-2" { > include "env_set" > $puppetserver = $env_set::puppetserver > > include "puppet::client"} > > -------------------------------------------------------------------------------- > This is fine for just a few variables, but it is going to get > unmanagable as the number of nodes increases as well as the number of > variables needed. > > Is there a better way to do this?--~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
RijilV
2008-Oct-31 16:52 UTC
[Puppet Users] Re: Templating to set variables based on environment
2008/10/31 tek-ops <mschenck@gmail.com>:> > What would really help is if there was a node definition like > "default" that was used by all nodes, not just ones that are otherwise > not defined. Although this "may" have the same scope issue of > resolving this with a class. >does the below not work for you? node default { ... whatever ... } node foo inherits default { .... more stuff ... } .r'' --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
tek-ops
2008-Oct-31 19:56 UTC
[Puppet Users] Re: Templating to set variables based on environment
You are a genius! Thank you very much :D Best Regards, Michael Schenck On Oct 31, 12:52 pm, RijilV <rij...@gmail.com> wrote:> 2008/10/31 tek-ops <msche...@gmail.com>: > > > > > What would really help is if there was a node definition like > > "default" that was used by all nodes, not just ones that are otherwise > > not defined. Although this "may" have the same scope issue of > > resolving this with a class. > > does the below not work for you? > > node default { > ... whatever ... > > } > > node foo inherits default { > .... more stuff ... > > } > > .r''--~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---