I have a class that pulls in some yum repositories. One of the yum repositories is disabled, but on one host I''d like to enable it. i.e. I''d like to do something like this: class { ''myyumrepos'': } yumrepo { ''EPEL'': enabled => 1, } What''s the best way to do this? I am using an ENC. -- Biltong biltong@fastmail.fm -- http://www.fastmail.fm - Email service worth paying for. Try it for free -- 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.
On May 15, 9:32 am, Biltong <bilt...@fastmail.fm> wrote:> I have a class that pulls in some yum repositories. One of the yum > repositories is disabled, but on one host I''d like to enable it. > > i.e. I''d like to do something like this: > > class { ''myyumrepos'': } > yumrepo { ''EPEL'': enabled => 1, } > > What''s the best way to do this? > > I am using an ENC.Closest to what you actually wrote might be class myyumrepos::epel_enabled inherits myyumrepos { Yumrepo[''EPEL''] { enabled => 1 } } include ''myyumrepos::epel_enabled'' Better, however, might be for class myyumrepos to rely on an external data source (e.g. via hiera) to choose the correct ''enabled'' value for each repo in the first place: # (in class myyumrepos) yumrepo { ''EPEL'': # ... enabled => hiera(''EPEL_enabled'') # ... } 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.
Many thanks for your reply, unfortunately I''m quickly getting into a mess: On Wed, May 16, 2012, at 07:58 AM, jcbollinger wrote:> > > On May 15, 9:32 am, Biltong <bilt...@fastmail.fm> wrote: > > I have a class that pulls in some yum repositories. One of the yum > > repositories is disabled, but on one host I''d like to enable it. > > > > i.e. I''d like to do something like this: > > > > class { ''myyumrepos'': } > > yumrepo { ''EPEL'': enabled => 1, } > > > > What''s the best way to do this? > > > > I am using an ENC. > > > Closest to what you actually wrote might be > > class myyumrepos::epel_enabled inherits myyumrepos { > Yumrepo[''EPEL''] { enabled => 1 } > } > > include ''myyumrepos::epel_enabled''My problem ehre is that I would need an myyumrepos::epel_enabled and an myyumrepos::epel_disabled, which seems very counter-intuitive (and with a lot of repetition for each other repository). What I''d like is to do define some defaults like this: ''EPEL'' enabled 1 gpgcheck 0 baseurl http://internal/EPEL ''OMGREPO'' enabled 0 gpgcheck 1 baseurl http://internal/OMGREPO then to enable it, but changing those defaults: myrepos::repo { ''EPEL'' enabled 0 ''OMGREPO'' enabled 1 gpgcheck 0 } **note: syntax removed above** The alternative is to put the repo name, enabled flag, baseurl, gpgcheck flag in each node manifest, which is also not good.> Better, however, might be for class myyumrepos to rely on an external > data source (e.g. via hiera) to choose the correct ''enabled'' value for > each repo in the first place: > > # (in class myyumrepos) > yumrepo { ''EPEL'': > # ... > enabled => hiera(''EPEL_enabled'') > # ... > }I can see this as being better, but it seems like a work around for not being able to represent (or think of a way to represent) the information above in puppet. I''d end up with a boolean for every repo, and the other options for each repo. Is there a way to do this without hiera, like using the imaginary syntax above?> > > 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. >-- http://www.fastmail.fm - A fast, anti-spam email service. -- 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.
On May 17, 4:19 am, Biltong <bilt...@fastmail.fm> wrote:> Many thanks for your reply, unfortunately I''m quickly getting into a > mess: >[...] > On Wed, May 16, 2012, at 07:58 AM, jcbollinger wrote: > > > On May 15, 9:32 am, Biltong <bilt...@fastmail.fm> wrote: > > > I have a class that pulls in some yum repositories. One of the yum > > > repositories is disabled, but on one host I''d like to enable it. > > > > i.e. I''d like to do something like this: > > > > class { ''myyumrepos'': } > > > yumrepo { ''EPEL'': enabled => 1, } > > > > What''s the best way to do this? > > > > I am using an ENC. > > > Closest to what you actually wrote might be > > > class myyumrepos::epel_enabled inherits myyumrepos { > > Yumrepo[''EPEL''] { enabled => 1 } > > } > > > include ''myyumrepos::epel_enabled'' > > My problem ehre is that I would need an myyumrepos::epel_enabled and an > myyumrepos::epel_disabled, which seems very counter-intuitive (and with > a lot of repetition for each other repository).No, you would need only the ''myyumrepos'' class you already have, plus the subclass I wrote. You could safely apply the former to every node, PLUS apply the latter to those nodes for which you want EPEL enabled. As I said, very similar to what you actually wrote.> What I''d like is to do define some defaults like this: > ''EPEL'' > enabled 1 > gpgcheck 0 > baseurlhttp://internal/EPEL > ''OMGREPO'' > enabled 0 > gpgcheck 1 > baseurlhttp://internal/OMGREPO > > then to enable it, but changing those defaults: > > myrepos::repo { > ''EPEL'' > enabled 0 > ''OMGREPO'' > enabled 1 > gpgcheck 0 > > } > > **note: syntax removed above** > > The alternative is to put the repo name, enabled flag, baseurl, gpgcheck > flag in each node manifest, which is also not good. > > > Better, however, might be for class myyumrepos to rely on an external > > data source (e.g. via hiera) to choose the correct ''enabled'' value for > > each repo in the first place: > > > # (in class myyumrepos) > > yumrepo { ''EPEL'': > > # ... > > enabled => hiera(''EPEL_enabled'') > > # ... > > } > > I can see this as being better, but it seems like a work around for not > being able to represent (or think of a way to represent) the information > above in puppet.The prevailing sentiment is that it is much better to separate your node- and site-specific data from your manifests. Those who hold that sentiment would consider the hiera approach inherently superior to what you seem to be asking for, not a work around at all. Nevertheless, read on.> I''d end up with a boolean for every repo, and the other > options for each repo.Any way around, you need to record every option value somewhere. Recording them in a hiera-served data store does not need to increase the volume of data or require needless duplication, and it is more flexible.> Is there a way to do this without hiera, like > using the imaginary syntax above?There are two main approaches to configuration parameters that vary from node to node: 1) Set default values, then override where desired, OR 2) Set the desired values in the first place via some dynamic means They can be used in various combinations. Puppet provides two mechanisms for overriding resource properties: 1a) Subclasses can override the properties of resources declared by their superclasses. We already talked about that. 1b) The properties of virtual of exported resources can be overridden when they are collected: class myclass { @notify { ''example'': message => ''default'' } } (elsewhere) Notify<| title == ''example'' |> { message => ''override'' } As I recently wrote in another thread, that''s mildly evil. I''d characterize even the subclass approach as slightly naughty, though there is at least one reasonable usage pattern for it. Both stand a chance of causing you trouble later, though I''d rate the collection- override approach as a bit more risky. On the other side, Puppet provides a wide variety of means to set resource parameters correctly in the first place. Hiera can be used for that purpose in various ways. You can also use conditional logic in your classes based on node facts, global variables, or class variables from other classes (e.g. some kind of parameters class). Or you can use parameterized classes. I don''t care much for these, as there are significant problems attending them (at least until the next Puppet major release). I rarely recommend them to anyone, and I don''t recommend them to you. Nevertheless, you may find them to your liking. It might look like this: # definition class repos::epel($enabled => 1, $gpgcheck => 0, $baseurl => ''http:// internal/epel'') { yumrepo { ''epel'': enabled => $enabled, gpgcheck => $gpgcheck, baseurl => $baseurl } } # declaration (somewhere else) providing a non-default value for the ''enabled'' parameter class { ''repos::epel'': enabled => 0 } Again, I recommend avoiding use of parameterized classes with any currently available version of Puppet. Lots of people use them anyway, however. 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.
Thanks very much for such a thorough and helpful response. I appreciate it. -- Biltong biltong@fastmail.fm On Thu, May 17, 2012, at 06:44 AM, jcbollinger wrote:> > > On May 17, 4:19 am, Biltong <bilt...@fastmail.fm> wrote: > > Many thanks for your reply, unfortunately I''m quickly getting into a > > mess: > >[...] > > On Wed, May 16, 2012, at 07:58 AM, jcbollinger wrote: > > > > > On May 15, 9:32 am, Biltong <bilt...@fastmail.fm> wrote: > > > > I have a class that pulls in some yum repositories. One of the yum > > > > repositories is disabled, but on one host I''d like to enable it. > > > > > > i.e. I''d like to do something like this: > > > > > > class { ''myyumrepos'': } > > > > yumrepo { ''EPEL'': enabled => 1, } > > > > > > What''s the best way to do this? > > > > > > I am using an ENC. > > > > > Closest to what you actually wrote might be > > > > > class myyumrepos::epel_enabled inherits myyumrepos { > > > Yumrepo[''EPEL''] { enabled => 1 } > > > } > > > > > include ''myyumrepos::epel_enabled'' > > > > My problem ehre is that I would need an myyumrepos::epel_enabled and an > > myyumrepos::epel_disabled, which seems very counter-intuitive (and with > > a lot of repetition for each other repository). > > > No, you would need only the ''myyumrepos'' class you already have, plus > the subclass I wrote. You could safely apply the former to every > node, PLUS apply the latter to those nodes for which you want EPEL > enabled. As I said, very similar to what you actually wrote. > > > > What I''d like is to do define some defaults like this: > > ''EPEL'' > > enabled 1 > > gpgcheck 0 > > baseurlhttp://internal/EPEL > > ''OMGREPO'' > > enabled 0 > > gpgcheck 1 > > baseurlhttp://internal/OMGREPO > > > > then to enable it, but changing those defaults: > > > > myrepos::repo { > > ''EPEL'' > > enabled 0 > > ''OMGREPO'' > > enabled 1 > > gpgcheck 0 > > > > } > > > > **note: syntax removed above** > > > > The alternative is to put the repo name, enabled flag, baseurl, gpgcheck > > flag in each node manifest, which is also not good. > > > > > Better, however, might be for class myyumrepos to rely on an external > > > data source (e.g. via hiera) to choose the correct ''enabled'' value for > > > each repo in the first place: > > > > > # (in class myyumrepos) > > > yumrepo { ''EPEL'': > > > # ... > > > enabled => hiera(''EPEL_enabled'') > > > # ... > > > } > > > > I can see this as being better, but it seems like a work around for not > > being able to represent (or think of a way to represent) the information > > above in puppet. > > > The prevailing sentiment is that it is much better to separate your > node- and site-specific data from your manifests. Those who hold that > sentiment would consider the hiera approach inherently superior to > what you seem to be asking for, not a work around at all. > Nevertheless, read on. > > > > I''d end up with a boolean for every repo, and the other > > options for each repo. > > > Any way around, you need to record every option value somewhere. > Recording them in a hiera-served data store does not need to increase > the volume of data or require needless duplication, and it is more > flexible. > > > > Is there a way to do this without hiera, like > > using the imaginary syntax above? > > > There are two main approaches to configuration parameters that vary > from node to node: > > 1) Set default values, then override where desired, OR > 2) Set the desired values in the first place via some dynamic means > > They can be used in various combinations. > > Puppet provides two mechanisms for overriding resource properties: > 1a) Subclasses can override the properties of resources declared by > their superclasses. We already talked about that. > 1b) The properties of virtual of exported resources can be overridden > when they are collected: > > class myclass { > @notify { ''example'': message => ''default'' } > } > > (elsewhere) > > Notify<| title == ''example'' |> { > message => ''override'' > } > > As I recently wrote in another thread, that''s mildly evil. I''d > characterize even the subclass approach as slightly naughty, though > there is at least one reasonable usage pattern for it. Both stand a > chance of causing you trouble later, though I''d rate the collection- > override approach as a bit more risky. > > On the other side, Puppet provides a wide variety of means to set > resource parameters correctly in the first place. Hiera can be used > for that purpose in various ways. You can also use conditional logic > in your classes based on node facts, global variables, or class > variables from other classes (e.g. some kind of parameters class). > > Or you can use parameterized classes. I don''t care much for these, as > there are significant problems attending them (at least until the next > Puppet major release). I rarely recommend them to anyone, and I don''t > recommend them to you. Nevertheless, you may find them to your > liking. It might look like this: > > # definition > class repos::epel($enabled => 1, $gpgcheck => 0, $baseurl => ''http:// > internal/epel'') { > yumrepo { ''epel'': > enabled => $enabled, > gpgcheck => $gpgcheck, > baseurl => $baseurl > } > } > > # declaration (somewhere else) providing a non-default value for the > ''enabled'' parameter > class { ''repos::epel'': > enabled => 0 > } > > > Again, I recommend avoiding use of parameterized classes with any > currently available version of Puppet. Lots of people use them > anyway, however. > > > 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. >-- http://www.fastmail.fm - A no graphics, no pop-ups email service -- 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.