This one has me scratching my head:
object Host "somehost" {
check_command = "dummy"
...
vars.dummy_text = {{
var host_name = macro("$host.name$")
var critical_services = ["api", "cockpit", "home", "console", "shell"]
var crit_names = []
var warn_names = []
for (svc in critical_services) {
svc_state = get_service(host_name, svc).state
if (svc_state == 2) {
crit_names.add(svc)
} else if (svc_state == 1) {
warn_names.add(svc)
}
}
var ok_names = critical_services - (crit_names + warn_names)
var ok_text = "OK Services: " + ok_names.join(", ")
var warn_text = "Warning Services: " + warn_names.join(", ")
var crit_text = "CRITICAL Services: " + crit_names.join(", ")
var status_text = ok_text + "\n" + warn_text + "\n" + crit_text + "\n" + host_name
return status_text
}}
}
And if I then call this on the cli:
get_host("somehost").vars.dummy_text()
Location: in /etc/icinga2/zones.d/somehost/somehost.conf: 31:21-31:40
/etc/icinga2/zones.d/somehost/somehost.conf(30): vars.dummy_text = {{
/etc/icinga2/zones.d/somehost/somehost.conf(31): var host_name = macro("$host.name$")
^^^^^^^^^^^^^^^^^^^^
/etc/icinga2/zones.d/somehost/somehost.conf(32): var critical_services = ["api", "cockpit", "home", "console", "shell"]
/etc/icinga2/zones.d/somehost/somehost.conf(33): var crit_names = []
/etc/icinga2/zones.d/somehost/somehost.conf:
^^^^^^^^^^^^^^^^^^^^
Argument is not a callable object.
If I refactor it using regular lambda syntax with use
, it works, eg.
vars.dummy_text = () use(name) => { var host_name = name....}
I’ve triple-checked the docs on macro
to make sure that I can call it from an abbreviated lambda that’s used for assigning to a custom variable. I’ve used macro
in a Service’s custom variable lambda without issue, and the docs show plenty of examples of this being done on a Host… But somehow, this one is not callable?
Am I missing something?