Chris F
2009-Dec-03 21:29 UTC
[Puppet Users] Iterating over array to create users and files
I want to do the following declare variable: $usernames = [ "chris", "bob", "tim" ] How would I iterate over it to create something like: user { "$username": home => "/home/$username", } Also is it possible to create a more complex structure with $UID and $Shell I''m thinking of something like this: $users = [ "chris": { UID => 800, Shell => "/usr/bin/bash", }, "bob": { UID => 801, Shell => "/usr/bin/zsh", }, ] Then I can reference via foreach $user $users { user { "$user": home => "/home/$user", UID => $user=>UID, Shell => $user=>Shell, } } Again this is only pseudocode, but I''m wondering if puppet has this kind of functionality or if there''s another way to do this that haven''t found. Also I want to iterate over an array of names to create individual files: $usernames = [ "bob", "tim" ] foreach $username $usernames { file { "/etc/httpd/conf.d/${username}-www.conf ensure => present, owner => "root", group => "root", mode => "644", notify => Service["httpd"], content => $environment ? { production => template("services/www/prod-www.conf.erb"), staging => template("services/www/stg-www.conf.erb"), development => template("services/www/dev-www.conf.erb"), } } With $username in various point in the template. Are either of these possible? Can anyone suggest a better way? I know for the file I can iterate with the template and create one large conf file, but I''d rather keep the conf files separate based on user. Thanks Chris -- 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+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.
Silviu Paragina
2009-Dec-04 02:22 UTC
Re: [Puppet Users] Iterating over array to create users and files
On 03.12.2009 23:29, Chris F wrote:> I want to do the following > > declare variable: > > $usernames = [ "chris", "bob", "tim" ] > > How would I iterate over it to create something like: > > user { "$username": > home => "/home/$username", > } > > Also is it possible to create a more complex structure with $UID and > $Shell > > I''m thinking of something like this: > > $users = [ "chris": { > UID => 800, > Shell => "/usr/bin/bash", > }, > "bob": { > UID => 801, > Shell => "/usr/bin/zsh", > }, ] >This is kind of close to the user defintion. You may define multiple resources of the same type somewhat like that (http://reductivelabs.com/trac/puppet/wiki/LanguageTutorial#resource-collections)> Then I can reference via > foreach $user $users { > user { "$user": > home => "/home/$user", > UID => $user=>UID, > Shell => $user=>Shell, > } > } >As far as I know puppet does not have iterative statements (except for templates which are a diffrent topic). You could create a define, which receives your parameters and builds other resources, and use the above semantics (from the link) ie define user_home($user,$UID, $Shell) { user { $user: home => "/home/${user}", uid => $UID, shell => $Shell, } and use it as user_home { "user1": blah; "user2": blah; }> Again this is only pseudocode, but I''m wondering if puppet has this > kind of functionality or if there''s another way to do this that > haven''t found. > > Also I want to iterate over an array of names to create individual > files: > > $usernames = [ "bob", "tim" ] > > foreach $username $usernames { > file { "/etc/httpd/conf.d/${username}-www.conf > ensure => present, > owner => "root", > group => "root", > mode => "644", > notify => Service["httpd"], > content => $environment ? { > production => template("services/www/prod-www.conf.erb"), > staging => template("services/www/stg-www.conf.erb"), > development => template("services/www/dev-www.conf.erb"), > } > } > > With $username in various point in the template. > > Are either of these possible? Can anyone suggest a better way? > > I know for the file I can iterate with the template and create one > large conf file, but I''d rather keep the conf files separate based on > user. > > Thanks > > Chris > > -- > > 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+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en. > > >Cheers, Silviu -- 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+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.