As many users of Icinga don’t know what the DSL has to offer, I’m going to show you how to use custom variables and apply for rules to make your life easier when writing configuration for your Icinga environment.
Idea
In this example we will use custom variables on a host to configure a dynamic set of services to monitor multiple web services behind a reverse proxy.
Host definition
On the host we define a custom dictionary called http_vhosts
and assign our virtual hosts to it. In our example a virtual host must have the attribute vhost
set and can provide the attributes ssl
and uri
.
object Host "reverse-proxy-1" { import "generic-host" address = "10.0.10.5" vars.http_vhosts = { "icingaweb2" = { vhost = "icinga.domain.com" ssl = true } "grafana" = { vhost = "grafana.domain.com" ssl = true } "api_v1" = { vhost = "api.domain.com" ssl = true uri = "/v1" } "api_v2" = { vhost = "api.domain.com" ssl = true uri = "/v2" } "status" = { vhost = "status.domain.com" } } }
Service apply for definitions
The important part here is the for
keyword behind the usual apply
. This tells Icinga to iterate over every virtual host in host.vars.http_vhosts
and execute the apply rule for each of them. As a result, you will have access to the variables key
and config
inside the scope of the apply rule.
apply Service "http_vhost_" for (key => config in host.vars.http_vhosts) { import "generic-service" check_command = "http" vars.http_vhost = config.vhost if (config.ssl) { vars.http_ssl = config.ssl } if (config.uri) { vars.http_uri = config.uri } assign where host.vars.http_vhosts }
Result
Our configuration has resulted in one service for each of our virtual hosts. The names use the name of the apply rule and the value of our key
variable.
Conclusion
Using advanced apply rules with for loops allows you to only define a flexible rule set and configure everything you need on the hosts. This can be extended using functions and more complex dictionary structures to suit every infrastructures needs. If you want to learn more about what the Icinga DSL has to offer, take a look at the Language Reference in our documentation.