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.