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 -~----------~----~----~----~------~----~------~--~---
