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 [email protected].
To post to this group, send email to [email protected].
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