Puppet Tips&Tricks: Variable variables

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
notice: //Do_this[eth0]/Notify[Found interface]/message: defined 'message' as 'Found interface'
notice: Found interface
notice: //Do_this[eth1]/Notify[Found interface]/message: defined 'message' as 'Found interface'

Tags: , , , , , , ,

7 Responses to “Puppet Tips&Tricks: Variable variables”

  1. […] it was still annoying nonetheless so I was pleasantly surprised when a friend pointed me towards this blog entry which offered a possible solution, you use Puppets inline_template function to evaluate a small ERB […]

  2. Stefan says:

    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.

  3. James Legg says:

    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.

  4. rdark says:

    There’s also the ‘getvar’ function as part of stdlib that can do the same thing, but tidier – $newvar = getvar(“ipaddress_${name}”)

  5. cognoscentis says:

    thank you, thank you, thank you!

  6. Thomas says:

    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’

  7. Kumina bv says:

    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.

Leave a Reply

Kumina helps companies innovate with the power of open source software. As specialists in managed IT operations since 2007, our mission is simple: building and managing the perfectly tailored technical infrastructures that allow our clients to thrive.

With fully managed solutions, we help our customers unlock the full potential of the cloud and Kubernetes. Our team also supports organisations with IT consulting and Kubernetes training courses. Learn more about our services or get in touch, we would love to hear about your business and projects.