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.

Reply via email to