On Friday, August 9, 2013 10:47:27 AM UTC-5, Simon Hönscheid wrote:
>
> I have an interesting problem an I found no solution yet:
>
> I want puppet to repeat an exec for every hast element I have:
>
> $database_users = [ {  user                  => 'jira',
>                                  passwort            => 'supersecure',
>                                  userpermissions => 'LOGIN CREATEDB 
> NOSUPERUSER NOCREATEROLE'
>                               },     
>                               {  user                  => 'test',
>                                  passwort           => 'test',
>                                  userpermissions => 'CREATEDB NOSUPERUSER 
> NOCREATEROLE'
>                               },
>                             ]    
>
> now i want to do something in config.pp with it, for every element. is 
> there a solution?
>
>   exec { "echo \"CREATE ROLE ${database_user[user]}  WITH 
> ${database_user[userpermissions]} PASSWORD '${database_user[password]}';\"| 
> psql":
>   onlyif => "test `echo \"\\dg\" | psql| grep ${database_user[user]}|wc 
> -l` -eq 0"
> }
>
> thanks simon
>


If you actually did have a hashmap (the local terminology being simply 
"hash") then your options would be different, but what you show is actually 
an array of hashes.  Puppet DSL does not have a general foreach feature, 
and neither of Sergey's suggestions is viable: passing the array as a 
resource title will cause the elements (the hashes) to be flattened to 
strings, and the data structure is not quite correct for create_resources().

>From a data perspective, the problem is that your individual hashes are 
anonymous.  That they carry identifying data internally is irrelevant -- 
it's meaningful to you, but not to Puppet generally.  Would it be feasible 
to structure your data along these lines instead?

$database_users = { 'jira' => {
                                 password            => 'supersecure',
                                 userpermissions => 'LOGIN CREATEDB 
NOSUPERUSER NOCREATEROLE'
                              },
                              'test' => {
                                 password           => 'test',
                                 userpermissions => 'CREATEDB NOSUPERUSER 
NOCREATEROLE'
                              },
                            }

That is the general form you would want to use with create_resources() and 
a definition along these lines:

define database::user ( $password, $userpermissions ) {
  exec { "db_user_${title}":
    command => "echo \"CREATE ROLE ${title}  WITH ${userpermissions} 
PASSWORD '${password}';\"| psql",
    unless => "echo '\\dg' | psql | grep -q ${title}"
  }
}

Alternatively, there are sometimes reasons to prefer explicit resource 
declarations over create_resources().  With the same (revised) form of the 
data, you could also do this:

  $db_usernames = keys($database_users)
  database::user2 { $db_usernames:
    userdata => $database_users
  }

with a slightly different definition:

define database::user2 ( $all_data ) {
  $data = $all_data[$title]
  exec { "db_user_${title}":
    command => "echo \"CREATE ROLE ${title}  WITH 
${data['userpermissions']} PASSWORD '${data['password']}';\"| psql",
    unless => "echo '\\dg' | psql | grep -q ${title}"
  }
}

Alternatively, if the top user data hash is in a class variable somewhere, 
then you can consider skipping passing it as a parameter, and let the 
definition instead access it directly.


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 post to this group, send email to puppet-users@googlegroups.com.
Visit this group at http://groups.google.com/group/puppet-users.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to