I tested the optional_command solution with success. The virtual machine could be provisioned but the first time, any reference to the asadmin provider failed even though the binary was present. I presume that once the prefetch of providers has been done and failed, then that type and provider become unusable at that provisioning.
I am quite sure that the response to my next question will be 'no' but I'll try anyway... It is possible to force a new binary check at each provider or type execution? The first check would fail but optional_command would handle it and at the real execution stage, the check would be successful and the command would be executed. Otherwise, two runs will be necessary at first provision :) On 28 oct, 14:47, jcbollinger <john.bollin...@stjude.org> wrote: > On Oct 27, 2:35 pm, Stefan Schulte <stefan.schu...@taunusstein.net> > wrote: > > > On Thu, Oct 27, 2011 at 08:00:05AM -0700, David Campos wrote: > > > Hello all, > > > > I am facing a problem while dealing with acustomprovider and its > > > requirements. I have included acustomprovider (with itscustom > > > types) into my puppet deployment that is expected to deal with all > > > tasks related to glassfish. This provider is able to create domains, > > > deploy applications and other features. > > > > This provider also requires a glassfish executable named 'asadmin' > > > that is available after glassfish is installed. If the executable is > > > available at the machine where agent is executed all works fine but if > > > it is not available a message like '[default] ←[0;37mdebug: > > > Puppet::Type::Domain::ProviderAsadmin: file asadmin does not exist←[0m > > > Could not find a default provider for domain' is returned. > > > > All that behaviour is normal since there are not alternative providers > > > for my resources and then the provider is not appliable but the > > > problem appears when I want to install the application AND THEN work > > > with the provider. In the theoretical scenario, puppet should install > > > glassfish, deal with path and finally do some work with the provider > > > but the real scenario is not that. The real scenario is that puppet > > > does a prefetch of all resources that deal with providers and tries to > > > load them. Since 'asadmin' is not yet available, the execution fails. > > > > Do anyone knows any way to let puppet skip that (or delay it until > > > glassfish has been installed) and finish successfully? Would stages do > > > a trick here? The only workaround that I have found has been perform > > > the installation in a first provision and then, at the second > > > provision, deal with resources. > > > > Scenario: > > > - Install Glassfish > > > - Configure Glassfish > > > - Deal with resources (provider) > > > Stages does not change a thing. At first I would suggest you > > watchhttps://projects.puppetlabs.com/issues/6907 > > > I can see three possibilities: > > > - write a dummy provider that doesn't do anything but also doesn't need > > anything. > > During the first puppet run puppet will pick the dummy provider. When > > you run puppet the next time your glassfish binary is already > > installed and puppet can choose between two providers. IIRC puppet > > tries to pick the one that is the most specific and that is the one > > with the most confines (so in your case it will probably work as > > desired) > > - use optional_commands :foo => '/bin/foo' instead of commands :foo => > > '/bin/foo'. This way the provider is still suitable even if your binary is > > not installed. But prefetching will fail on the first run (but puppet > > should apply the catalog so the second run should work ok) > > - use acustomfact that tells you if the binary of your provider is > > installed. Wrap each resource in your manifest in an if clause. Now > > you also need two puppet runs but the first run does not throw an > > error. > > I think Stefan has covered the field pretty well. Personally, I don't > much like the dummy provider, though: it will prevent the error > message, but because it doesn't actually do anything, it lies to the > Puppet agent whenever it claims to have synchronized a resource. This > may cause dependent resources to fail, and it results in two runs > being required to achieve the target state, if that's an issue. > > The optional_commands approach is pretty smooth, and the prefetch > problem is only relevant if it's possible for there to be existing > resources when the needed binary is not already present. If you can > use some alternative mechanism to prefetch resources then there > doesn't have to be a prefetching problem at all. If you make the > provider a do-nothing in the event that asadmin is missing then this > option becomes a superset of the dummy provider option; that would > allow you to avoid multiple providers. (I still don't like the dummy > option even when implemented this way, however: better to fail a > resource if asadmin is not available when the time comes to sync it.) > > Thecustomfact approach is pretty easy to add on top of your existing > provider and manifests. Also, if you arrange your resources suitably > then you should be able simply to conditionally include an entire > class, instead of conditionally declaring each of several separate > resources. > > 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+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.