On Monday, April 28, 2014 2:34:43 PM UTC-5, Alex Scoble wrote: > > Hi All, > > I'm working on a module that builds KVM/libvirt hosts and populates them > with predefined VMs. > > So far I have the module to where it can create any number of virtual > nets, storage pools and volumes using virsh, but it isn't pretty. > > I've read on various threads here that create_resources is not a good > function to use. This was stated quite emphatically by R.I. Pienaar and > others. >
If anyone has been vocal (here) about Puppet functions not to use then it's me, and create_resources() is not one I rant about. As a general rule I do prefer expressing configuration in DSL where that's feasible, and you can, in fact, do the job of create_resources() almost entirely with ordinary Puppet DSL (you need to add only stdlib's keys() function). Nevertheless, I'm not persuaded that going to substantial effort and length to avoid create_resources() is necessarily a win. On the other hand, I have come out rather strongly against the ensure_resource() function. Were you perhaps thinking of that? > > Already I've run into the situation where it's hard to control order in > which two separate create_resources functions are run and I've seen some > kludges to fix it, but I'm looking for a better way and hoping that it > doesn't involve the use of custom types because that's currently more than > I want to deal with. > > Indeed, one of the issues that does exist with create_resources() is that you cannot express resource references in Hiera data (though I have seen one recent report that claims otherwise). When part of the point of using that function in the first place is that you don't want to have to know exactly which resources you are actually declaring, that can present a challenge. It is, nevertheless, a challenge that can be worked around. In some cases, the "workaround" is a mechanism, such as collector chaining, that you might reasonably have used anyway. > It would be super helpful if anyone could point me to a puppet module on github that presents me with a better pattern to use with the hiera data. [...] > Any other help or criticisms are also welcome. That looks pretty clean to me already. It does appear that maybe you want to express relationships between your Kvm::Virtpool and Kvm::Virtvol instances, but Garrett appears already to have gotten you pointed in a useful direction with that (collector chaining). If you want responses to particular commentary about the create_resources() function then it would be helpful to provide a pointer to that commentary. R.I. is a pretty smart guy, and he has thought a lot about how Puppet can and should use data, so I'm not remotely going to try to respond to anything he may have said on the topic without actually reading it for myself Additional, minor comments about your code: 1. For any but the most simple Execs, I recommend using descriptive resource titles, and expressing the commands themselves via Exec's 'command' property. It is much, much easier that way to understand their purpose, especially in log output. 2. There are only two reasons for using class inheritance: to make a variable of the inherited class reliably available for use as a class parameter default, and to enable overriding properties of a resource declared by the inherited class. The latter is the original purpose, and the former is merely a side effect, but the former is by far the more common reason for class inheritance these days. In all other cases, an ordinary class declaration (include 'foo') can and should be used instead, if indeed anything of the sort is needed at all. Avoid class inheritance where it is unneeded. Especially avoid inheriting from a parameterized class. 3. Your class kvm has the strung 'undef' as the defined default value for a bunch of parameters. That's quite different from the undef keyword; is it what you really mean? If it were then I would expect to see some kind of test for those values, but I don't. 4. More generally, don't define class and type parameter default values unless you really mean it. If you forget to declare a needed resource or class parameter then Puppet will diagnose the issue if and only if the parameter has no defined default value. Do not write definitions or classes such that failure to declare all the needed parameters will silently yield an invalid configuration, as appears may be the case for some of your defined parameters. John -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-users/cf039141-1935-4380-bfc5-65cc99410726%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.