Is there something like a map function in puppet?

[Any suggestions on a better title are welcome]

For better or worse, I currently have a data structure like so (yaml)

servers:
  server1.example.com:
    private_ip: 10.0.0.1
    public_ip: 22.33.44.1
  server2.example.com:
    private_ip: 10.0.0.2
    public_ip: 22.33.44.2
global_roles:
  nagios: 
    - server1
    - server2

I can pull that into puppet and do things like:

$nagios_monitor = $global_roles['nagios'][0]
$private_ip["${nagios_monitor}.example.com"]['private_ip']

What I want is a way to get an array of the private IPs for all listed nagios servers. Is there a good way to do this with my existing data structure?

If the data structure needs to be changed, for this to work nicely, suggestions on a good way to present this data to puppet are also welcome. I suspect such a change would make life generally easier, but there's a fair bit of existing code that would need to changed, and I really wouldn't want any mis-steps.


Yes, there's a map function in puppet. https://docs.puppet.com/puppet/latest/reference/function.html#map

Something like this might be what you want to do:

$nagios_servers = $global_roles['nagios']
$ip_addresses = $nagios_servers.map |$server| { $private_ip["${server}.example.com"]['private_ip'] }

It requires the future parser on 3.8 and is automatically included as of 4.0.