Aus der Dokumentation kann man entnehmen das Objekte und Funktionen ihren eigene Variablen-Scope besitzen und nicht ohne weiteres auf Variablen eines „übergelagerten Scopes“ zu greifen dürfen. Sollen z.B. Objekte über eine Schleife erzeugt werden, die sich nur maginal voneinander unterscheiden, können Variablen an diese bzw. dessen Scope via use gegeben werden.
template CheckCommand "by_ssh_base" { import "by_ssh" vars.by_ssh_plugindir = PluginDir } var cmdlist = [ "load", ""ntp_time", "yum" ] for (cmd in cmdlist) { object CheckCommand "by_ssh_" + cmd use(cmd) { import cmd vars.by_ssh_arguments = arguments arguments = null vars.by_ssh_command = "$by_ssh_plugindir$/check_" + cmd import "by_ssh_base" } }
Gleiches Verfahren lässt sich auch für das Erzeugen von Services über eine Schleife anwenden. Hier soll sich nun jedoch die Service-Bezeichnung vom verwendenten Check-Command unterscheiden und es kommt kein Array zum Einsatz, sondern ein Dictionary. Das folgende Beispiel ist allerdings für Commands, die via command_endpoint auf einer anderen Icinga-2-Instanz aufgerufen werden.
var srvlist = { "load" = "load" "time" = "ntp_time" "updates" = "yum" } for (srv => cmd in srvlist) { apply Service srv use(cmd) { import "generic-service" check_command = cmd command_endpoint = host.name assign where host.vars.os == "Linux" ignore where host.vars.noagent } }
Werden im apply-Block mehrere Variablen, z.B. im obigen Beispiel auch srv, kann use durch Komma getrennt mehrere Variablen „weiter reichen“.
