Sometimes you want to use variable variables, for instance when you want to iterate over all the ipaddress_* facts that facter found. Using something like ${ipaddress_$if}
doesn’t work, though. Inline_template to the rescue! Thanks to Volcane on IRC, this is a possible solution:
$ifs = split($interfaces,",") define do_this { $mule = "ipaddress_${name}" $donkey = inline_template("<%= scope.lookupvar(mule) %>") notify { "Found interface $donkey":; } } do_this { $ifs:; }
This will output:
$ sudo puppet net.pp notice: Found interface 172.29.121.22 notice: //Do_this[eth0]/Notify[Found interface 172.29.121.22]/message: defined 'message' as 'Found interface 172.29.121.22' notice: Found interface 213.207.83.56 notice: //Do_this[eth1]/Notify[Found interface 213.207.83.56]/message: defined 'message' as 'Found interface 213.207.83.56'
Tags: facter, inline_template, puppet, puppet-tips-and-tricks, tips, tricks, variable, variables
All it does for me is printing out the internface name, but not the IP address. Do I miss anything?
Notice: ipaddress_ens192
Notice: /Stage[main]/Main/Node[localhost]/Do_this[ens192]/Notify[ipaddress_ens192]/message: defined ‘message’ as ‘ipaddress_ens192’
Notice: ipaddress_ens224
Notice: /Stage[main]/Main/Node[localhost]/Do_this[ens224]/Notify[ipaddress_ens224]/message: defined ‘message’ as ‘ipaddress_ens224’
It works for us with Puppet 3.8.7, although you should run ‘puppet apply net.pp’. That is the only Puppet version we use at the moment so I can’t test it on a different one.
thank you, thank you, thank you!
There’s also the ‘getvar’ function as part of stdlib that can do the same thing, but tidier – $newvar = getvar(“ipaddress_${name}”)
Thanks for this, feel like over two years after you wrote this something better should be available in puppet, but as of yet I haven’t found it.
Thanks a lot! I spent hours to try to find the right syntax. Love the “Google God” which brought me to your really helpful blog.