I am trying to override variables in a class that is defined in the default node profile. I want parent class to be included in every single node, but override its variables in others. I have tried it several different ways now, and every single time the variables either become unset (undefined) or are set to the value of the first if statement. Here is my current iteration of failure. warn_real is always equal to processorcount, no matter if I override it or not. class nrpe::load ($warn = ''UNSET'', $crit = ''UNSET'') { package { nagios-plugins-load: ensure => installed } if $warn == ''UNSET'' { $warn_real = $processorcount } if $crit == ''UNSET'' { $crit_real = $processorcount * 2 } file { "/etc/nagios/command.d/load.cfg": owner => root, group => root, mode => 640, content => template("nrpe/load.cfg.erb"), notify => Service[nrpe] } } class nrpe::load::override($warn = ''UNSET'', $crit = ''UNSET'') inherits nrpe::load { Class["nrpe::load"] { warn => $warn, crit => $crit } } node "somenode.tld" inherits basenode { class {''nrpe::load::override'': warn => 5, crit => 10 } } -- 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/-/3-A3XgYtmh8J. 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.
Another iteration of failure is the following. This one is in the likeness of ::parms for a class, but if it nrpe:load inherits override class, then I can''t declare the override class anywhere else. This was my first attempt to do this, and have tried 4 other iterations of this, but as far as I can tell, because it can''t inherit the class, it will ONLY use the default values, which can only be undef or some other default value, again defeating the ability to override. class nrpe::load { package { nagios-plugins-load: ensure => installed } if $nrpe::load::override::warn == ''UNSET'' { $warn = $processorcount } else { $warn = $nrpe::load::override::warn } if $nrpe::load::override::crit == ''UNSET'' { $crit = $processorcount * 2 } else { $crit = $nrpe::load::override::crit } file { "/etc/nagios/command.d/load.cfg": owner => root, group => root, mode => 640, content => template("nrpe/load.cfg.erb"), notify => Service[nrpe] } } class nrpe::load::override($warn = ''UNSET'', $crit = ''UNSET'') { } On Monday, September 24, 2012 12:47:31 PM UTC-4, George Shammas wrote:> > I am trying to override variables in a class that is defined in the > default node profile. I want parent class to be included in every single > node, but override its variables in others. I have tried > it several different ways now, and every single time the variables either > become unset (undefined) or are set to the value of the first if statement. > > Here is my current iteration of failure. warn_real is always equal > to processorcount, no matter if I override it or not. > > class nrpe::load ($warn = ''UNSET'', $crit = ''UNSET'') { > > package { nagios-plugins-load: ensure => installed } > > if $warn == ''UNSET'' { > $warn_real = $processorcount > } > if $crit == ''UNSET'' { > $crit_real = $processorcount * 2 > } > > file { "/etc/nagios/command.d/load.cfg": > owner => root, > group => root, > mode => 640, > content => template("nrpe/load.cfg.erb"), > notify => Service[nrpe] > } > } > > > class nrpe::load::override($warn = ''UNSET'', $crit = ''UNSET'') inherits > nrpe::load { > > Class["nrpe::load"] { > warn => $warn, > crit => $crit > } > } > > node "somenode.tld" inherits basenode { > class {''nrpe::load::override'': > warn => 5, > crit => 10 > } > } > >-- 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/-/aZCaK4L7k_4J. 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.
On Monday, September 24, 2012 11:47:31 AM UTC-5, George Shammas wrote:> > I am trying to override variables in a class that is defined in the > default node profile. I want parent class to be included in every single > node, but override its variables in others. I have tried > it several different ways now, and every single time the variables either > become unset (undefined) or are set to the value of the first if statement.You cannot override class variables. You especially cannot override class parameters. You can override only resource properties (and classes are not resources, appearances notwithstanding). Moreover, subclasses do not set parameters for their parent classes, even if they themselves have parameters of the same names. Therefore, it is usually a bad idea to inherit from a parametrized class (in fact, the v 2.7 docs say it''s not supported). If you do so, then you must explicitly declare the parent class on every node for which you want to set non-default parameters, whether or not you also declare the child class. Since you don''t actually use the variables in question in your example, I can''t guess what your larger purpose may be, therefore it is difficult for me to advise you. Nevertheless, at the low level we are focused on, you can achieve something similar to what you have asked by employing a data hierarchy instead of a class hierarchy. That is what the Hiera module is all about. Since hiera will be integrated into Puppet 3, getting started with it now is also forward-looking. Once you install hiera and set up your data, the Puppet side could be as simple as this: class nrpe::load { # no parameters package { ''nagios-plugins-load'': ensure => installed } $warn_real = hiera(''nrpe::warn'') $crit_real = hiera(''nrpe::crit'') # alternatively, load $warn and $crit via hiera, # and retain the original logic for setting # $warn_real and $crit_real file { "/etc/nagios/command.d/load.cfg": owner => root, group => root, mode => 640, content => template("nrpe/load.cfg.erb"), notify => Service[nrpe] } } node "somenode.tld" inherits basenode { # no subclass involved } 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/-/UeqNuH8zyXMJ. 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.
Hi John, Thanks for the response. They variables are only used in the template, as the NRPE daemon is manged by flat files. I will do some research into hiera. --George On Tuesday, September 25, 2012 11:28:31 AM UTC-4, jcbollinger wrote:> > > > On Monday, September 24, 2012 11:47:31 AM UTC-5, George Shammas wrote: >> >> I am trying to override variables in a class that is defined in the >> default node profile. I want parent class to be included in every single >> node, but override its variables in others. I have tried >> it several different ways now, and every single time the variables either >> become unset (undefined) or are set to the value of the first if statement. > > > You cannot override class variables. You especially cannot override class > parameters. You can override only resource properties (and classes are not > resources, appearances notwithstanding). > > Moreover, subclasses do not set parameters for their parent classes, even > if they themselves have parameters of the same names. Therefore, it is > usually a bad idea to inherit from a parametrized class (in fact, the v 2.7 > docs say it''s not supported). If you do so, then you must explicitly > declare the parent class on every node for which you want to set > non-default parameters, whether or not you also declare the child class. > > Since you don''t actually use the variables in question in your example, I > can''t guess what your larger purpose may be, therefore it is difficult for > me to advise you. Nevertheless, at the low level we are focused on, you > can achieve something similar to what you have asked by employing a data > hierarchy instead of a class hierarchy. That is what the Hiera module is > all about. Since hiera will be integrated into Puppet 3, getting started > with it now is also forward-looking. > > Once you install hiera and set up your data, the Puppet side could be as > simple as this: > > class nrpe::load { # no parameters > package { ''nagios-plugins-load'': ensure => installed } > > $warn_real = hiera(''nrpe::warn'') > $crit_real = hiera(''nrpe::crit'') > > # alternatively, load $warn and $crit via hiera, > # and retain the original logic for setting > # $warn_real and $crit_real > > file { "/etc/nagios/command.d/load.cfg": > owner => root, > group => root, > mode => 640, > content => template("nrpe/load.cfg.erb"), > notify => Service[nrpe] > } > } > > node "somenode.tld" inherits basenode { > # no subclass involved > } > > > 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/-/0C5HzeVgMZoJ. 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.
I''ve solved the identical problem using defines instead of classes. I know that hiera can be a better solution, but I''m waiting for next major release to adopt hiera. I''ve a generic nrpe::check define: each check is a define that use this generic definition, so my check_load.pp in nrpe module is define nrpe::check_load( $warn1=8, $warn5=4, $warn15=2, $crit1=20, $crit5=10, $crit15=5, ) { if ! is_numeric($warn1) { fail(''Variable warn1 must be numeric'') } if ! is_numeric($warn5) { fail(''Variable warn5 must be numeric'') } if ! is_numeric($warn15) { fail(''Variable warn15 must be numeric'') } if ! is_numeric($crit1) { fail(''Variable crit1 must be numeric'') } if ! is_numeric($crit5) { fail(''Variable crit5 must be numeric'') } if ! is_numeric($crit15) { fail(''Variable crit15 must be numeric'') } # -r plugin option make it compatible with multi-core cpu nrpe::check{ ''load'': params => "-r -w ${warn1},${warn5},${warn15} -c ${crit1},${crit5},${crit15}" } } In generic_host I create a resource with no parameters, so defaults apply: nrpe::check_load { ''load'': } If I''ve a node with a medium greater load than my default I do: node ''node-with-high-load'' inherits generic_host { Nrpe::Check_load[''load'']{ warn5 => 20 } } Hopes this helps, L 2012/9/25 George Shammas <georgyo@gmail.com>:> Hi John, > > Thanks for the response. They variables are only used in the template, as > the NRPE daemon is manged by flat files. I will do some research into hiera. > > --George > > On Tuesday, September 25, 2012 11:28:31 AM UTC-4, jcbollinger wrote: >> >> >> >> On Monday, September 24, 2012 11:47:31 AM UTC-5, George Shammas wrote: >>> >>> I am trying to override variables in a class that is defined in the >>> default node profile. I want parent class to be included in every single >>> node, but override its variables in others. I have tried it several >>> different ways now, and every single time the variables either become unset >>> (undefined) or are set to the value of the first if statement. >> >> >> You cannot override class variables. You especially cannot override class >> parameters. You can override only resource properties (and classes are not >> resources, appearances notwithstanding). >> >> Moreover, subclasses do not set parameters for their parent classes, even >> if they themselves have parameters of the same names. Therefore, it is >> usually a bad idea to inherit from a parametrized class (in fact, the v 2.7 >> docs say it''s not supported). If you do so, then you must explicitly >> declare the parent class on every node for which you want to set non-default >> parameters, whether or not you also declare the child class. >> >> Since you don''t actually use the variables in question in your example, I >> can''t guess what your larger purpose may be, therefore it is difficult for >> me to advise you. Nevertheless, at the low level we are focused on, you can >> achieve something similar to what you have asked by employing a data >> hierarchy instead of a class hierarchy. That is what the Hiera module is >> all about. Since hiera will be integrated into Puppet 3, getting started >> with it now is also forward-looking. >> >> Once you install hiera and set up your data, the Puppet side could be as >> simple as this: >> >> class nrpe::load { # no parameters >> package { ''nagios-plugins-load'': ensure => installed } >> >> $warn_real = hiera(''nrpe::warn'') >> $crit_real = hiera(''nrpe::crit'') >> >> # alternatively, load $warn and $crit via hiera, >> # and retain the original logic for setting >> # $warn_real and $crit_real >> >> file { "/etc/nagios/command.d/load.cfg": >> owner => root, >> group => root, >> mode => 640, >> content => template("nrpe/load.cfg.erb"), >> notify => Service[nrpe] >> } >> } >> >> node "somenode.tld" inherits basenode { >> # no subclass involved >> } >> >> >> 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.