On Wednesday, September 24, 2014 2:38:40 PM UTC-5, aar...@gmail.com wrote: > > Neil and John, > > You guys both agree on using individual files and I was thinking of how I > could do this. If I have one file or three, it may not be a big deal to do > individually, but some applications could need dozens or more. > > I don't know if it is possible, some searching makes me believe it isn't, > but I'll share my thought. > > Can you do something like a for loop in a bash script. So it would be > something like... >
You can if you turn on the future parser, but there's an old-school way to approach the problem that might actually be better in your case, because it would be reusable across multiple application modules. The old-school way revolves around Puppet's behavior when an array is provided as a resource title <https://docs.puppetlabs.com/puppet/3/reference/lang_resources.html#array-of-titles>, which is to declare a separate resource for each element of the array. When the declared resource is of a defined type, it's body is evaluated once for each title, which yields a pretty good analog of iteration. Example: define my_module::mac_preference_file ($application) { include my_module::mac_preferences_base file { "/System/Library/User Template/English.lproj/Library/Preferences/${title}": ensure => 'file', owner => 'root', group => 'wheel', mode => '0600' source => "puppet:///modules/${application}/Preferences/${title}" } } # Manages the base preferences directory. # Must be a class so that it can be declared multiple times.. class my_module::mac_preferences_base { # Note: not recursive. In this version, all managed contents # are managed by separate File resources. file { "/System/Library/User Template/English.lproj/Library/Preferences": ensure => 'directory', owner => 'root', group => 'wheel', mode => '0600' } } That might be used like so: class some_application { $my_preference_files = [ 'some.plist', 'another.plist', 'random.plist' ] my_module::mac_preference_file { $my_preference_files: application => 'some_application' } # ... } > > > for files in .../module_name/Preferences/ # get a list of files and > folders in the Preferences subfolder on the Puppet Master > file { '/System/Library/User > Template/English.lproj/Library/Preferences/${files}': #Directory on Puppet > agent, the variable would make this a unique resource and it would work for > a file and folder > source => "puppet:///modules/${module_name}/Preferences/${files}", # > Since it is looping every file on the Puppet Master would match perfectly > to the same exact file/folder on the agent. No duplicate declaration. > done > > John, > > I think I understand what your code is trying to do, but am not sure I > understand how to implement. I think that $preference_sources is making a > list of paths (puppet paths) to the Preferences folder of each module, > Yes, the approach depends on creating an array of all the source directories from which to sync files into the master Preferences folder. You cannot manage the Preferences folder more than once, but you *can* give it multiple sources. > and I know that sourceselect all means that it will use all sources > instead of stopping at the first match. I also see that the > preferences_sources is being created from a regex expression that I don't > completely understand, though that shouldn't matter in getting this to > work. > > Is this still a defined type? > No, it is a class. That's what "class" instead of "define" at the beginning means. There's no point to making it a defined type, because any attempt to declare it (as a resource) more than once will fail with a duplicate resource error. Also, if you make it a class then you have the option of using automated data binding to assign the parameter value (via Hiera). > Should class mac_managed_preferences be defined > Well, yes. Its definition is what I presented. Do you mean to ask whether it should be *declared*? Also yes. A class definition by itself does nothing for you. In this case, you make an array of the names of all the application modules whose preferences you want to manage, and assign that array as the class's parameter. If you do that via Hiera and automated data binding, then you can declare the mac_managed_preferences class as many times as you like, using the 'include' function. If you use a resource-like class declaration, however, then it must not be evaluated more than once. > or are we making a new class for each applications preferences (assuming > that's the $applications variable in the class name)? > There is no variable in the class name. The class has a parameter named $applications, but it is not part of the class name. You are already supposing that there is a separate (and different) class for each managed application, however. In fact, you are supposing that there is an entirely separate *module* for each managed application. Class mac_managed_preferences would be a single class, separate from all the per-application classes. Whatever class or node block declares all the per-application classes (and which therefore knows which ones are being declared) would also declare class mac_managed_preferences. Overall, you seem to be really struggling with a lot of fundamental Puppet concepts. Puppet DSL is substantially unlike any programming language you may have used (and indeed, it is not itself a programming language), so it would be to your advantage to read the language reference section of the Puppet reference manual <https://docs.puppetlabs.com/puppet/3/reference/>, and to at least skim the resource type reference <https://docs.puppetlabs.com/references/3.4.stable/type.html> and the function reference <https://docs.puppetlabs.com/references/3.4.stable/function.html>. The language reference is an easy read, and quite good. 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/cad88aac-ea27-42dc-80bc-a6b34a231733%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.