Arnau Bria
2011-Oct-07 11:05 UTC
[Puppet Users] how to modify a parameter inside a parametrized class
Hi all, I think I''m not understanding something... from http://docs.puppetlabs.com/guides/parameterized_classes.html : "The parameters you name can be used as normal local variables throughout the class definition" so, I have a class like: class common::nrpe($ensure=''absent'') { [...] if ($::kernel==''Linux'') and ($::lsbmajdistrelease==''6'') { $ensure=''present'' } so, by default the class is dissabled, but if it''s a Linux release 6, the value must be present. so, I define the class in a Linux release 6 like: nodes ''test'' { class { ''common::nrpe'' : } } pupet fails with error: Cannot reassign variable ensure So, what am I missunderstanding? What is the correct way for doing what I''m trying? TIA, Arnau -- 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
2011-Oct-07 12:55 UTC
[Puppet Users] Re: how to modify a parameter inside a parametrized class
On Oct 7, 6:05 am, Arnau Bria <arnaub...@pic.es> wrote:> Hi all, > > I think I''m not understanding something... > > fromhttp://docs.puppetlabs.com/guides/parameterized_classes.html: > > "The parameters you name can be used as normal local variables > throughout the class definition" > > so, I have a class like: > > class common::nrpe($ensure=''absent'') { > [...] > > if ($::kernel==''Linux'') and ($::lsbmajdistrelease==''6'') { > $ensure=''present'' > > } > > so, by default the class is dissabled, but if it''s a Linux release 6, > the value must be present. > > so, I define the class in a Linux release 6 like: > > nodes ''test'' { > class { ''common::nrpe'' : } > > } > > pupet fails with error: > > Cannot reassign variable ensure > > So, what am I missunderstanding? What is the correct way for doing what > I''m trying?You are misunderstanding that Puppet variables'' values can never be reassigned. Once a variable has a value, it never changes throughout the compilation of that catalog. This is an aspect of Puppet DSL''s declarative nature. As to how to accomplish what you ask, the usual way would be to use the parameter and any other data you want to select the value of a *different* variable, and then use that second variable. The same thing is fairly common practice in defined types: class common::nrpe($ensure=''absent'') { [...] if ($::kernel==''Linux'') and ($::lsbmajdistrelease==''6'') { $really_ensure = ''present'' } else { $really_ensure = $ensure } [...] } While I''m on this topic, I''ll throw in that I would find it terribly confusing if a class or definition failed to honor my specification for a parameter named ''ensure''. I''d also find it confusing, though less so, for the default value of an ''ensure'' parameter to be ''absent''. I recommend that you tweak your design a bit so as to not leave little traps like those for yourself and others to stumble over later. Or at least document the wazoo out of that thing. John -- 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.
Arnau Bria
2011-Oct-07 13:11 UTC
Re: [Puppet Users] Re: how to modify a parameter inside a parametrized class
On Fri, 7 Oct 2011 05:55:34 -0700 (PDT) jcbollinger jcbollinger wrote: Hi John,> You are misunderstanding that Puppet variables'' values can never be > reassigned. Once a variable has a value, it never changes throughout > the compilation of that catalog. This is an aspect of Puppet DSL''s > declarative nature. > > As to how to accomplish what you ask, the usual way would be to use > the parameter and any other data you want to select the value of a > *different* variable, and then use that second variable. The same > thing is fairly common practice in defined types: > > class common::nrpe($ensure=''absent'') { > [...] > > if ($::kernel==''Linux'') and ($::lsbmajdistrelease==''6'') { > $really_ensure = ''present'' > } else { > $really_ensure = $ensure > } > > [...] > > }Ok, I solved the issue with something like that but I thought it was some kind of ugly workaround... but if it''s common I feel better with my code.> While I''m on this topic, I''ll throw in that I would find it terribly > confusing if a class or definition failed to honor my specification > for a parameter named ''ensure''.Sorry John, but I don''t understand this point.> I''d also find it confusing, though > less so, for the default value of an ''ensure'' parameter to be > ''absent''. I recommend that you tweak your design a bit so as to not > leave little traps like those for yourself and others to stumble over > later. Or at least document the wazoo out of that thing.I''m playing with this class. First time I do something like above. Our production services have a default present, but this one is still in test and I''d like to test it only on Linux 6., so I was playing with logic inside new class :-)> JohnMany thanks for your reply, Arnau -- 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
2011-Oct-07 13:34 UTC
[Puppet Users] Re: how to modify a parameter inside a parametrized class
On Oct 7, 8:11 am, Arnau Bria <arnaub...@pic.es> wrote:> On Fri, 7 Oct 2011 05:55:34 -0700 (PDT) > > jcbollinger jcbollinger wrote: > > While I''m on this topic, I''ll throw in that I would find it terribly > > confusing if a class or definition failed to honor my specification > > for a parameter named ''ensure''. > > Sorry John, but I don''t understand this point.Because of the consistent manner of "ensure" parameters'' use in Puppet''s built-in resources, and the associated conventions even for custom and defined types, I would be very surprised if I ever declared something with "ensure => ''absent''" but that specification was overridden to the opposite. Indeed, I would be at least somewhat surprised by that with *any* parameter. Don''t give me the option if you don''t intend to honor it. Inasmuch as this is for testing purposes, however, that''s a different story. I don''t think I would test in the way you are doing, but then again, maybe I would. John -- 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.
Arnau Bria
2011-Oct-07 13:47 UTC
Re: [Puppet Users] Re: how to modify a parameter inside a parametrized class
On Fri, 7 Oct 2011 06:34:00 -0700 (PDT) jcbollinger jcbollinger wrote:> On Oct 7, 8:11 am, Arnau Bria <arnaub...@pic.es> wrote: > > On Fri, 7 Oct 2011 05:55:34 -0700 (PDT) > > > > jcbollinger jcbollinger wrote: > > > While I''m on this topic, I''ll throw in that I would find it > > > terribly confusing if a class or definition failed to honor my > > > specification for a parameter named ''ensure''. > > > > Sorry John, but I don''t understand this point. > > Because of the consistent manner of "ensure" parameters'' use in > Puppet''s built-in resources, and the associated conventions even for > custom and defined types, I would be very surprised if I ever declared > something with "ensure => ''absent''" but that specification was > overridden to the opposite. Indeed, I would be at least somewhat > surprised by that with *any* parameter. Don''t give me the option if > you don''t intend to honor it.Ok, now it''s clear. I should put that logic outside the class, in node/param definitions .. something like: if ($::kernel==''Linux'') and ($::lsbmajdistrelease==''6'') { class { ''common::nrpe'' : ensure => absnet, }else{ class { ''common::nrpe'' : ensure => present, }> Inasmuch as this is for testing purposes, however, that''s a different > story. I don''t think I would test in the way you are doing, but then > again, maybe I would.> > John >Many thanks for your reply, Arnau -- 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.