You were close with your attempt, but you were using the wrong type of lambda. To avoid the issues resulting from the two facts that Puppet variables are immutable within the same scope and also cannot be used outside of a lambda scope if defined within a lambda, you must use an rvalue lambda https://en.wikipedia.org/wiki/Value_(computer_science)#R-values_and_addresses. I solved your problem using the rvalue lambda map
https://docs.puppet.com/puppet/latest/function.html#map.
$site_developer_base = ['admin', 'api', 'web'].map |$site| {
$developer_base = ['tom', 'jeff', 'harry'].map |$developer| {
"${site}.${developer}.dev.mydomain.com"
}
}
If I do a notify { $site_developer_base: }
this outputs:
Notice: admin.tom.dev.mydomain.com
Notice: admin.jeff.dev.mydomain.com
Notice: admin.harry.dev.mydomain.com
Notice: api.tom.dev.mydomain.com
Notice: api.jeff.dev.mydomain.com
Notice: api.harry.dev.mydomain.com
Notice: web.tom.dev.mydomain.com
Notice: web.jeff.dev.mydomain.com
Notice: web.harry.dev.mydomain.com
proving that $site_developer_base
has the array that you want.
$ssl_domains << "$site.$developer.dev.mydomain.com"
line creates and destroys the variable, not modifies the outer one. – Befoul${site}.${developer}.dev.mydomain.com
. Additionally, that code is going to create a$ssl_domains
array with ten elements. Is that what you meant, or did you want the array to be four elements? – Yonah