On Tue, Sep 1, 2009 at 12:05 PM, Luke Kanies <[email protected]> wrote:

>
> On Sep 1, 2009, at 5:21 AM, S H wrote:
>
> > On Mon, Aug 31, 2009 at 9:31 PM, Luke Kanies <[email protected]> wrote:
> >
> > On Aug 26, 2009, at 7:44 AM, S H wrote:
> >
> > > On Wed, Aug 26, 2009 at 1:20 AM, Luke Kanies <[email protected]>
> > wrote:
> > >
> > > On Aug 25, 2009, at 4:00 PM, S H wrote:
> > >
> > > >
> > > >
> > > > On Tue, Aug 25, 2009 at 5:33 PM, Luke Kanies <[email protected]>
> > > wrote:
> > > >
> > > > On Aug 25, 2009, at 1:57 PM, S H wrote:
> > > >
> > > > > If this is the wrong list, please let me know. I'm emailing
> > > puppet-
> > > > > dev since this is firmly in the realm of Puppet code rather than
> > > > > typical manifest implementation.
> > > >
> > > > I think this is the right list.  At the least, I read this one far
> > > > more than -users, and I'm likely to be the only person who knows
> > > some
> > > > of this stuff, unfortunately.
> > > >
> > > > >
> > > > > I'm not sure if this is a bug or if I'm doing it wrong, so any
> > > help
> > > > > is appreciated. This issue exposed itself while I was working on
> > > my
> > > > > Bacula type/provider and I have confirmed that it is also a
> > > problem
> > > > > with Naginator.
> > > > >
> > > > > Using Naginator as the example, if I have a manifest like this:
> > > > >
> > > > >        nagios_host { "test1":
> > > > >                alias => "alias1",
> > > > >                address => "address1",
> > > > >        }
> > > > >
> > > > >        nagios_contactgroup { "test2":
> > > > >                target => "/etc/nagios/nagios_host.cfg",
> > > > >                alias => "alias2",
> > > > >        }
> > > > >
> > > > > Only one of the changes will go through at a time. If I add
> > > another
> > > > > nagios_host to the manifest, either both nagios_host
> > > configurations
> > > > > or the nagios_contactgroup configuration will go through.
> > > > >
> > > > > What I suspect is probably very different than the reality, but
> > > here
> > > > > it is anyway: provider instances for a given type share the
> > > @records
> > > > > value so modifications to one are reflected in all of
> > > them.Different
> > > > > types don't share @records values, so flushing leaves the last
> > man
> > > > > standing.
> > > > >
> > > > > Obviously, I still haven't figured out the exact details. Can
> > > anyone
> > > > > shed any light on this?
> > > >
> > > > Um, that's pretty strange, and I don't really know what could be
> > > > causing it.  I've certainly never heard of anything like it.
> > > >
> > > > Each provider class should be completely independent, and
> > there's no
> > > > way that flushing one should cause another not to get flushed.
> > > >
> > > > Are you saying that the changes don't get logged, or that they
> > don't
> > > > happen?  If they don't even get logged, do you get anything
> > > > informative if you run with --verbose --evaltrace?
> > > >
> > > > They all get flushed and the changes get logged - the problem lies
> > > > in the way they're flushed.
> > > >
> > > > nagios_host and nagios_contactgroup have each prefetched the file
> > > > (if it exists) and modified their own @records variables to
> > reflect
> > > > the changes as they deem necessary. Puppet then calls flush on
> > each
> > > > of these - let's say nagios_host goes first.
> > > >
> > > > So nagios_host's to_file() method produces the string that
> > > > represents the file according to its internal representation, and
> > > > that string is written to the file. Then the same thing happens
> > for
> > > > nagios_contactgroup, but since nagios_host changes didn't affect
> > its
> > > > own representation of the string, the file is written out as it
> > was
> > > > originally + nagios_contactgroup's changes.
> > > >
> > > > I'll get you the output tomorrow when I'm back at my workstation,
> > > > but it looks perfectly normal. I pieced this together by yaml-
> > > > dumping variables in various places until I had an idea of what
> > was
> > > > happening.
> > >
> > > I'm... still confused.  I'll wait for your email with the outputs.
> > >
> > > puppet# cat test.pp
> > > nagios_host { "test1":
> > >         alias => "alias1",
> > >         address => "address1",
> > > }
> > >
> > > nagios_contactgroup { "test2":
> > >         target => "/etc/nagios/nagios_host.cfg",
> > >         alias => "alias2",
> > > }
> > >
> > > puppet# puppet  --trace --evaltrace --debug --verbose test.pp
> > > puppet# rm /etc/nagios/nagios_host.cfg
> > > puppet# touch /etc/nagios/nagios_host.cfg
> > > puppet# puppet  --trace --evaltrace --debug --verbose test.pp
> > > info: Loading fact fc_location
> > > /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:
> > > command not found:
> > > debug: Creating default schedules
> > > debug: Prefetching naginator resources for nagios_host
> > > debug: Prefetching naginator resources for nagios_contactgroup
> > > debug: //Nagios_host[test1]: Changing ensure
> > > debug: //Nagios_host[test1]: 1 change(s)
> > > notice: //Nagios_host[test1]/ensure: created
> > > debug: Flushing nagios_host provider target /etc/nagios/
> > > nagios_host.cfg
> > > debug: Failed to load library 'shadow' for feature 'libshadow'
> > > debug: Finishing transaction 341800180 with 0 changes
> > > debug: //Nagios_contactgroup[test2]: Changing ensure
> > > debug: //Nagios_contactgroup[test2]: 1 change(s)
> > > notice: //Nagios_contactgroup[test2]/ensure: created
> > > debug: Flushing nagios_contactgroup provider target /etc/nagios/
> > > nagios_host.cfg
> > > info: Filebucket[/var/puppet/clientbucket]: Adding /etc/nagios/
> > > nagios_host.cfg(901d65a4e8dacbf4e87ba544d5a86d9a)
> > > debug: Finishing transaction 345760510 with 2 changes
> > > puppet# cat /etc/nagios/nagios_host.cfg
> > > # HEADER: This file was autogenerated at Wed Aug 26 10:24:24 -0400
> > > 2009
> > > # HEADER: by puppet.  While it can still be managed manually, it
> > > # HEADER: is definitely not recommended.
> > > define contactgroup {
> > >         contactgroup_name              test2
> > >         alias                          alias2
> > > }
> > > puppet#
> > >
> > >
> > >
> > > If I add a yaml-dump to parsedfile.rb's self.flush_target(target)
> > > method so it looks like this:
> > >
> > > def self.flush_target(target)
> > >         backup_target(target)
> > >
> > >         records = target_records(target).reject { |r|
> > >             r[:ensure] == :absent
> > >         }
> > >         require 'yaml'
> > >         puts YAML::dump(records)
> > >
> > >     target_object(target).write(to_file(records))
> > > end
> > >
> > >
> > > We get:
> > >
> > > puppet# puppet --trace --evaltrace --debug --verbose test.pp
> > > info: Loading fact fc_location
> > > /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:
> > > command not found:
> > > debug: Creating default schedules
> > > debug: Prefetching naginator resources for nagios_host
> > > debug: Prefetching naginator resources for nagios_contactgroup
> > > debug: //Nagios_host[test1]: Changing ensure
> > > debug: //Nagios_host[test1]: 1 change(s)
> > > notice: //Nagios_host[test1]/ensure: created
> > > debug: Flushing nagios_host provider target /etc/nagios/
> > > nagios_host.cfg
> > > debug: Failed to load library 'shadow' for feature 'libshadow'
> > > debug: Finishing transaction 341645600 with 0 changes
> > > ---
> > > - !ruby/object:host
> > >   ensure: :present
> > >   on_disk: true
> > >   parameters:
> > >     address: address1
> > >     host_name: test1
> > >     alias: alias1
> > >   target: /etc/nagios/nagios_host.cfg
> > > debug: //Nagios_host[test2]: Changing ensure
> > > debug: //Nagios_host[test2]: 1 change(s)
> > > notice: //Nagios_host[test2]/ensure: created
> > > debug: Flushing nagios_host provider target /etc/nagios/
> > > nagios_host.cfg
> > > ---
> > > - !ruby/object:host
> > >   ensure: :present
> > >   on_disk: true
> > >   parameters:
> > >     address: address1
> > >     host_name: test1
> > >     alias: alias1
> > >   target: /etc/nagios/nagios_host.cfg
> > > - !ruby/object:host
> > >   ensure: :present
> > >   on_disk: true
> > >   parameters:
> > >     address: address2
> > >     host_name: test2
> > >     alias: alias2
> > >   target: /etc/nagios/nagios_host.cfg
> > > debug: //Nagios_contactgroup[test3]: Changing ensure
> > > debug: //Nagios_contactgroup[test3]: 1 change(s)
> > > notice: //Nagios_contactgroup[test3]/ensure: created
> > > debug: Flushing nagios_contactgroup provider target /etc/nagios/
> > > nagios_host.cfg
> > > info: Filebucket[/var/puppet/clientbucket]: Adding /etc/nagios/
> > > nagios_host.cfg(f81a6f0dd450b6617255a18c3787abfc)
> > > ---
> > > - !ruby/object:contactgroup
> > >   ensure: :present
> > >   on_disk: true
> > >   parameters:
> > >     contactgroup_name: test3
> > >     alias: alias3
> > >   target: /etc/nagios/nagios_host.cfg
> > > debug: Finishing transaction 345707210 with 3 changes
> > > puppet#
> > >
> > >
> > > So you can see that, while both nagios_host resources were flushed
> > > to the file in the second step, only the contactgroup was flushed in
> > > the third step. This overwrote the file that contained the two
> > > nagios hosts (which was backed up to the filebucket right before).
> > >
> > > Hopefully that makes things clearer.
> >
> >
> > I'm even more confused.  It looks like you've got multiple
> > transactions in a single run; how is that happening?  Did you just
> > skip the parts where you ran puppetd multiple times and include
> > concatenated output from multiple runs, or are there are actually
> > multiple transactions in the runs?
> >
> > There are two different runs in my previous email, but there are
> > multiple transactions per run.
> >
> > The first (I've removed the shell commands so you can just see the
> > run output):
> >
> > info: Loading fact fc_location
> > /usr/local/lib/ruby/site_ruby/
> > 1.8/rubygems/custom_require.rb:31: command not found:
> > debug: Creating default schedules
> > debug: Prefetching naginator resources for nagios_host
> > debug: Prefetching naginator resources for nagios_contactgroup
> > debug: //Nagios_host[test1]: Changing ensure
> > debug: //Nagios_host[test1]: 1 change(s)
> > notice: //Nagios_host[test1]/ensure: created
> > debug: Flushing nagios_host provider target /etc/nagios/
> > nagios_host.cfg
> > debug: Failed to load library 'shadow' for feature 'libshadow'
> > debug: Finishing transaction 341800180 with 0 changes
> > debug: //Nagios_contactgroup[test2]: Changing ensure
> > debug: //Nagios_contactgroup[test2]: 1 change(s)
> > notice: //Nagios_contactgroup[test2]/ensure: created
> > debug: Flushing nagios_contactgroup provider target /etc/nagios/
> > nagios_host.cfg
> > info: Filebucket[/var/puppet/clientbucket]: Adding /etc/nagios/
> > nagios_host.cfg(901d65a4e8dacbf4e87ba544d5a86d9a)
> > debug: Finishing transaction 345760510 with 2 changes
> >
> >
> > Ignore the second run (the one with YAML::dump in it) since I
> > apparently copied and pasted over my explanation of modifications to
> > the test.pp file. I think it's just muddying the waters anyway.
> >
> > As far as how the multiple transactions are happening, I don't know
> > what to tell you.
>
> Can you run that with --evaltrace?  That will at least tell me when
> one resource ends and another begins.
>

puppet# rm /etc/nagios/nagios_host.cfg
puppet# touch /etc/nagios/nagios_host.cfg
puppet# puppet  --evaltrace --debug --verbose test.pp
info: Loading fact fc_location
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31: command not
found:
debug: Creating default schedules
debug: Prefetching naginator resources for nagios_host
debug: Prefetching naginator resources for nagios_contactgroup
debug: //Nagios_host[test1]: Changing ensure
debug: //Nagios_host[test1]: 1 change(s)
notice: //Nagios_host[test1]/ensure: created
debug: Flushing nagios_host provider target /etc/nagios/nagios_host.cfg
debug: Failed to load library 'shadow' for feature 'libshadow'
debug: Finishing transaction 341782830 with 0 changes
debug: //Nagios_contactgroup[test2]: Changing ensure
debug: //Nagios_contactgroup[test2]: 1 change(s)
notice: //Nagios_contactgroup[test2]/ensure: created
debug: Flushing nagios_contactgroup provider target
/etc/nagios/nagios_host.cfg
info: Filebucket[/var/puppet/clientbucket]: Adding
/etc/nagios/nagios_host.cfg(b5e406fa9677c37052588054dec709d2)
debug: Finishing transaction 345757570 with 2 changes
puppet# # cat /etc/nagios/nagios_host.cfg
# HEADER: This file was autogenerated at Tue Sep 01 13:29:57 -0400 2009
# HEADER: by puppet.  While it can still be managed manually, it
# HEADER: is definitely not recommended.
define contactgroup {
        contactgroup_name              test2
        alias                          alias2
}
puppet#



>
> And maybe ping me on IRC so we can debug this in realtime; I'll answer
> if I'm available and we can work it out without the asynchronousness
> of email.
>

I'll do that.

-Shawn


>
> --
> A citizen of America will cross the ocean to fight for democracy, but
> won't cross the street to vote in a national election.
>     --Bill Vaughan
> ---------------------------------------------------------------------
> Luke Kanies | http://reductivelabs.com | http://madstop.com
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to