diff --git a/doc/6-advanced-topics.md b/doc/6-advanced-topics.md index 70c3752a4..7ca11490e 100644 --- a/doc/6-advanced-topics.md +++ b/doc/6-advanced-topics.md @@ -1,494 +1 @@ # Advanced Topics - -## Downtimes - -Downtimes can be scheduled for planned server maintenance or -any other targetted service outage you are aware of in advance. - -Downtimes will suppress any notifications, and may trigger other -downtimes too. If the downtime was set by accident, or the duration -exceeds the maintenance, you can manually cancel the downtime. -Planned downtimes will also be taken into account for SLA reporting -tools calculating the SLAs based on the state and downtime history. - -> **Note** -> -> Downtimes may overlap with their start and end times. If there -> are multiple downtimes triggered for one object, the overall downtime depth -> will be more than `1`. This is useful when you want to extend -> your maintenance window taking longer than expected. - -### Fixed and Flexible Downtimes - -A `fixed` downtime will be activated at the defined start time, and -removed at the end time. During this time window the service state -will change to `NOT-OK` and then actually trigger the downtime. -Notifications are suppressed and the downtime depth is incremented. - -Common scenarios are a planned distribution upgrade on your linux -servers, or database updates in your warehouse. The customer knows -about a fixed downtime window between 23:00 and 24:00. After 24:00 -all problems should be alerted again. Solution is simple - -schedule a `fixed` downtime starting at 23:00 and ending at 24:00. - -Unlike a `fixed` downtime, a `flexible` downtime end does not necessarily -happen at the provided end time. Instead the downtime will be triggered -by the state change in the time span defined by start and end time, but -then last a defined duration in minutes. - -Imagine the following scenario: Your service is frequently polled -by users trying to grab free deleted domains for immediate registration. -Between 07:30 and 08:00 the impact will hit for 15 minutes and generate -a network outage visible to the monitoring. The service is still alive, -but answering too slow to Icinga 2 service checks. -For that reason, you may want to schedule a downtime between 07:30 and -08:00 with a duration of 15 minutes. The downtime will then last from -its trigger time until the duration is over. After that, the downtime -is removed (may happen before or after the actual end time!). - -### Scheduling a downtime - -This can either happen through a web interface (Icinga 1.x Classic UI or Web) -or by using the external command pipe provided by the `ExternalCommandListener` -configuration. - -Fixed downtimes require a start and end time (a duration will be ignored). -Flexible downtimes need a start and end time for the time span, and a duration -independent from that time span. - -> **Note** -> -> Modern web interfaces treat services in a downtime as `handled`. - -### Triggered Downtimes - -This is optional when scheduling a downtime. If there is already a downtime -scheduled for a future maintenance, the current downtime can be triggered by -that downtime. This renders useful if you have scheduled a host downtime and -are now scheduling a child host's downtime getting triggered by the parent -downtime on NOT-OK state change. - -### Recurring Downtimes - -[ScheduledDowntime objects](#objecttype-scheduleddowntime) can be used to set up -recurring downtimes for services. - -Example: - - template ScheduledDowntime "backup-downtime" { - author = "icingaadmin", - comment = "Scheduled downtime for backup", - - ranges = { - monday = "02:00-03:00", - tuesday = "02:00-03:00", - wednesday = "02:00-03:00", - thursday = "02:00-03:00", - friday = "02:00-03:00", - saturday = "02:00-03:00", - sunday = "02:00-03:00" - } - } - - object Host "localhost" inherits "generic-host" { - ... - services["load"] = { - templates = [ "generic-service" ], - - check_command = "load", - - scheduled_downtimes["backup"] = { - templates = [ "backup-downtime" ] - } - }, - } - - -## Comments - -Comments can be added at runtime and are persistent over restarts. You can -add useful information for others on repeating incidents (for example -"last time syslog at 100% cpu on 17.10.2013 due to stale nfs mount") which -is primarly accessible using web interfaces. - -Adding and deleting comment actions are possible through the external command pipe -provided with the `ExternalCommandListener` configuration. The caller must -pass the comment id in case of manipulating an existing comment. - -## Acknowledgements - -If a problem is alerted and notified you may signal the other notification -receipients that you are aware of the problem and will handle it. - -By sending an acknowledgement to Icinga 2 (using the external command pipe -provided with `ExternalCommandListener` configuration) all future notifications -are suppressed, a new comment is added with the provided description and -a notification with the type `NotificationFilterAcknowledgement` is sent -to all notified users. - -> **Note** -> -> Modern web interfaces treat acknowledged problems as `handled`. - -### Expiring Acknowledgements - -Once a problem is acknowledged it may disappear from your `handled problems` -dashboard and no-one ever looks at it again since it will suppress -notifications too. - -This `fire-and-forget` action is quite common. If you're sure that a -current problem should be resolved in the future at a defined time, -you can define an expiration time when acknowledging the problem. - -Icinga 2 will clear the acknowledgement when expired and start to -re-notify if the problem persists. - -## Cluster - -An Icinga 2 cluster consists of two or more nodes and can reside on multiple -architectures. The base concept of Icinga 2 is the possibility to add additional -features using components. In case of a cluster setup you have to add the -cluster feature to all nodes. Before you start configuring the diffent nodes -it's necessary to setup the underlying communication layer based on SSL. - -### Certificate Authority and Certificates - -Icinga 2 comes with two scripts helping you to create CA and node certificates -for you Icinga 2 Cluster. - -The first step is the creation of CA using the following command: - - icinga2-build-ca - -Please make sure to export a variable containing an empty folder for the created -CA files: - - export ICINGA_CA="/root/icinga-ca" - -In the next step you have to create a certificate and a key file for every node -using the following command: - - icinga2-build-key icinga-node-1 - -Please create a certificate and a key file for every node in the Icinga 2 -Cluster and save the CA key in case you want to set up certificates for -additional nodes at a later date. - -### Enable the Cluster Configuration - -Until the cluster-component is moved into an independent feature you have to -enable the required libraries in the icinga2.conf configuration file: - - library "cluster" - -### Configure the ClusterListener Object - -The ClusterListener needs to be configured on every node in the cluster with the -following settings: - - Configuration Setting |Value - -------------------------|------------------------------------ - ca_path | path to ca.crt file - cert_path | path to server certificate - key_path | path to server key - bind_port | port for incoming and outgoing conns - peers | array of all reachable nodes - ------------------------- ------------------------------------ - -A sample config part can look like this: - - /** - * Load cluster library and configure ClusterListener using certificate files - */ - library "cluster" - - object ClusterListener "cluster" { - ca_path = "/etc/icinga2/ca/ca.crt", - cert_path = "/etc/icinga2/ca/icinga-node-1.crt", - key_path = "/etc/icinga2/ca/icinga-node-1.key", - - bind_port = 8888, - - peers = [ "icinga-node-2" ] - } - -> **Note** -> -> The certificate files must be readable by the user Icinga 2 is running as. Also, -> the private key file should not be world-readable. - -Peers configures the direction used to connect multiple nodes together. If have -a three node cluster consisting of - -* node-1 -* node-2 -* node-3 - -and `node-3` is only reachable from `node-2`, you have to consider this in your -peer configuration. - -### Configure Cluster Endpoints - -In addition to the configured port and hostname every endpoint can have specific -abilities to send configuration files to other nodes and limit the hosts allowed -to send configuration files. - - Configuration Setting |Value - -------------------------|------------------------------------ - host | hostname - port | port - accept_config | defines all nodes allowed to send configs - config_files | defines all files to be send to that node - MUST BE AN ABSOLUTE PATH - ------------------------- ------------------------------------ - -A sample config part can look like this: - - /** - * Configure config master endpoint - */ - - object Endpoint "icinga-node-1" { - host = "icinga-node-1.localdomain", - port = 8888, - config_files = ["/etc/icinga2/conf.d/*.conf"] - } - -If you update the configuration files on the configured file sender, it will -force a restart on all receiving nodes after validating the new config. - -A sample config part for a config receiver endpoint can look like this: - - /** - * Configure config receiver endpoint - */ - - object Endpoint "icinga-node-2" { - host = "icinga-node-2.localdomain", - port = 8888, - accept_config = [ "icinga-node-1" ] - } - -By default these configuration files are saved in /var/lib/icinga2/cluster/config. - -In order to load configuration files which were received from a remote Icinga 2 -instance you will have to add the following include directive to your -`icinga2.conf` configuration file: - - include (IcingaLocalStateDir + "/lib/icinga2/cluster/config/*/*") - -### Initial Cluster Sync - -In order to make sure that all of your cluster nodes have the same state you will -have to pick one of the nodes as your initial "master" and copy its state file -to all the other nodes. - -You can find the state file in `/var/lib/icinga2/icinga2.state`. Before copying -the state file you should make sure that all your cluster nodes are properly shut -down. - - -### Assign Services to Cluster Nodes - -By default all services are distributed among the cluster nodes with the `Checker` -feature enabled. -If you require specific services to be only executed by one or more checker nodes -within the cluster, you must define `authorities` as additional service object -attribute. Required Endpoints must be defined as array. - - object Host "dmz-host1" inherits "generic-host" { - services["dmz-oracledb"] = { - templates = [ "generic-service" ], - authorities = [ "icinga-node-1" ], - } - } - -> **Tip** -> -> Most common usecase is building a classic Master-Slave-Setup. The master node -> does not have the `Checker` feature enabled, and the slave nodes are checking -> services based on their location, inheriting from a global service template -> defining the authorities. - -### Cluster Health Check - -The Icinga 2 [ITL](#itl) ships an internal check command checking all configured -`EndPoints` in the cluster setup. The check result will become critical if -one or more configured nodes are not connected. - -Example: - - object Host "icinga2a" inherits "generic-host" { - services["cluster"] = { - templates = [ "generic-service" ], - check_interval = 1m, - check_command = "cluster", - authorities = [ "icinga2a" ] - }, - } - -> **Note** -> -> Each cluster node should execute its own local cluster health check to -> get an idea about network related connection problems from different -> point of views. Use the `authorities` attribute to assign the service -> check to the configured node. - -### Host With Multiple Cluster Nodes - -Special scenarios might require multiple cluster nodes running on a single host. -By default Icinga 2 and its features will drop their runtime data below the prefix -`IcingaLocalStateDir`. By default packages will set that path to `/var`. -You can either set that variable as constant configuration -definition in [icinga2.conf](#icinga2-conf) or pass it as runtime variable to -the Icinga 2 daemon. - - # icinga2 -c /etc/icinga2/node1/icinga2.conf -DIcingaLocalStateDir=/opt/node1/var - -## Domains - -A [Service](#objecttype-service) object can be restricted using the `domains` attribute -array specifying endpoint privileges. -A Domain object specifices the ACLs applied for each [Endpoint](#objecttype-endpoint). - -The following example assigns the domain `dmz-db` to the service `dmz-oracledb`. Endpoint -`icinga-node-dmz-1` does not allow any object modification (no commands, check results) and only -relays local messages to the remote node(s). The endpoint `icinga-node-dmz-2` processes all -messages read and write (accept check results, commands and also relay messages to remote -nodes). - -That way the service `dmz-oracledb` on endpoint `icinga-node-dmz-1` will not be modified -by any cluster event message, and could be checked by the local authority too presenting -a different state history. `icinga-node-dmz-2` still receives all cluster message updates -from the `icinga-node-dmz-1` endpoint. - - object Host "dmz-host1" inherits "generic-host" { - services["dmz-oracledb"] = { - templates = [ "generic-service" ], - domains = [ "dmz-db" ], - authorities = [ "icinga-node-dmz-1", "icinga-node-dmz-2"], - } - } - - object Domain "dmz-db" { - acl = { - icinga-node-dmz-1 = (DomainPrivReadOnly), - icinga-node-dmz-2 = (DomainPrivReadWrite) - } - } - -## Dependencies - -Icinga 2 uses host and service [Dependency](#objecttype-dependency) objects either directly -defined or as inline definition as `dependencies` dictionary. The `parent_host` and `parent_service` -attributes are mandatory, `child_host` and `child_service` attributes are obsolete within -inline definitions in an existing service object or service inline definition. - -A service can depend on a host, and vice versa. A service has an implicit dependency (parent) -to its host. A host to host dependency acts implicit as host parent relation. -When dependencies are calculated, not only the immediate parent is taken into -account but all parents are inherited. - -A common scenario is the Icinga 2 server behind a router. Checking internet -access by pinging the Google DNS server `google-dns` is a common method, but -will fail in case the `dsl-router` host is down. Therefore the example below -defines a host dependency which acts implicit as parent relation too. - -Furthermore the host may be reachable but ping samples are dropped by the -router's firewall. In case the `dsl-router``ping4` service check fails, all -further checks for the `google-dns` `ping4` service should be suppressed. -This is achieved by setting the `disable_checks` attribute to `true`. - - object Host "dsl-router" { - services["ping4"] = { - templates = "generic-service", - check_command = "ping4" - } - - macros = { - address = "192.168.1.1", - }, - } - - object Host "google-dns" { - services["ping4"] = { - templates = "generic-service", - check_command = "ping4", - dependencies["dsl-router-ping4"] = { - parent_host = "dsl-router", - parent_service = "ping4", - disable_checks = true - } - } - - macros = { - address = "8.8.8.8", - }, - - dependencies["dsl-router"] = { - parent_host = "dsl-router" - }, - - } - -## Check Result Freshness - -In Icinga 2 active check freshness is enabled by default. It is determined by the -`check_interval` attribute and no incoming check results in that period of time. - - threshold = last check execution time + check interval - -Passive check freshness is calculated from the `check_interval` attribute if set. - - threshold = last check result time + check interval - -If the freshness checks are invalid, a new check is executed defined by the -`check_command` attribute. - -## Check Flapping - -The flapping algorithm used in Icinga 2 does not store the past states but -calculcates the flapping threshold from a single value based on counters and -half-life values. Icinga 2 compares the value with a single flapping threshold -configuration attribute named `flapping_threshold`. - -> **Note** -> -> Flapping must be explicitely enabled setting the `Service` object attribute -> `enable_flapping = 1`. - -## Volatile Services - -By default all services remain in a non-volatile state. When a problem -occurs, the `SOFT` state applies and once `max_check_attempts` attribute -is reached with the check counter, a `HARD` state transition happens. -Notifications are only triggered by `HARD` state changes and are then -re-sent defined by the `notification_interval` attribute. - -It may be reasonable to have a volatile service which stays in a `HARD` -state type if the service stays in a `NOT-OK` state. That way each -service recheck will automatically trigger a notification unless the -service is acknowledged or in a scheduled downtime. - -## Modified Attributes - -Icinga 2 allows you to modify defined object attributes at runtime different to -the local configuration object attributes. These modified attributes are -stored as bit-shifted-value and made available in backends. Icinga 2 stores -modified attributes in its state file and restores them on restart. - -Modified Attributes can be reset using external commands. - - -## Plugin API - -Currently the native plugin api inherited from the `Monitoring Plugins` (former -`Nagios Plugins`) project is available. -Future specifications will be documented here. - -### Monitoring Plugin API - -The `Monitoring Plugin API` (former `Nagios Plugin API`) is defined in the -[Monitoring Plugins Development Guidelines](https://www.monitoring-plugins.org/doc/guidelines.html). - - - diff --git a/doc/6.01-downtimes.md b/doc/6.01-downtimes.md new file mode 100644 index 000000000..6d2ab0b19 --- /dev/null +++ b/doc/6.01-downtimes.md @@ -0,0 +1,102 @@ +## Downtimes + +Downtimes can be scheduled for planned server maintenance or +any other targetted service outage you are aware of in advance. + +Downtimes will suppress any notifications, and may trigger other +downtimes too. If the downtime was set by accident, or the duration +exceeds the maintenance, you can manually cancel the downtime. +Planned downtimes will also be taken into account for SLA reporting +tools calculating the SLAs based on the state and downtime history. + +> **Note** +> +> Downtimes may overlap with their start and end times. If there +> are multiple downtimes triggered for one object, the overall downtime depth +> will be more than `1`. This is useful when you want to extend +> your maintenance window taking longer than expected. + +### Fixed and Flexible Downtimes + +A `fixed` downtime will be activated at the defined start time, and +removed at the end time. During this time window the service state +will change to `NOT-OK` and then actually trigger the downtime. +Notifications are suppressed and the downtime depth is incremented. + +Common scenarios are a planned distribution upgrade on your linux +servers, or database updates in your warehouse. The customer knows +about a fixed downtime window between 23:00 and 24:00. After 24:00 +all problems should be alerted again. Solution is simple - +schedule a `fixed` downtime starting at 23:00 and ending at 24:00. + +Unlike a `fixed` downtime, a `flexible` downtime end does not necessarily +happen at the provided end time. Instead the downtime will be triggered +by the state change in the time span defined by start and end time, but +then last a defined duration in minutes. + +Imagine the following scenario: Your service is frequently polled +by users trying to grab free deleted domains for immediate registration. +Between 07:30 and 08:00 the impact will hit for 15 minutes and generate +a network outage visible to the monitoring. The service is still alive, +but answering too slow to Icinga 2 service checks. +For that reason, you may want to schedule a downtime between 07:30 and +08:00 with a duration of 15 minutes. The downtime will then last from +its trigger time until the duration is over. After that, the downtime +is removed (may happen before or after the actual end time!). + +### Scheduling a downtime + +This can either happen through a web interface (Icinga 1.x Classic UI or Web) +or by using the external command pipe provided by the `ExternalCommandListener` +configuration. + +Fixed downtimes require a start and end time (a duration will be ignored). +Flexible downtimes need a start and end time for the time span, and a duration +independent from that time span. + +> **Note** +> +> Modern web interfaces treat services in a downtime as `handled`. + +### Triggered Downtimes + +This is optional when scheduling a downtime. If there is already a downtime +scheduled for a future maintenance, the current downtime can be triggered by +that downtime. This renders useful if you have scheduled a host downtime and +are now scheduling a child host's downtime getting triggered by the parent +downtime on NOT-OK state change. + +### Recurring Downtimes + +[ScheduledDowntime objects](#objecttype-scheduleddowntime) can be used to set up +recurring downtimes for services. + +Example: + + template ScheduledDowntime "backup-downtime" { + author = "icingaadmin", + comment = "Scheduled downtime for backup", + + ranges = { + monday = "02:00-03:00", + tuesday = "02:00-03:00", + wednesday = "02:00-03:00", + thursday = "02:00-03:00", + friday = "02:00-03:00", + saturday = "02:00-03:00", + sunday = "02:00-03:00" + } + } + + object Host "localhost" inherits "generic-host" { + ... + services["load"] = { + templates = [ "generic-service" ], + + check_command = "load", + + scheduled_downtimes["backup"] = { + templates = [ "backup-downtime" ] + } + }, + } \ No newline at end of file diff --git a/doc/6.02-comments.md b/doc/6.02-comments.md new file mode 100644 index 000000000..10a796e6f --- /dev/null +++ b/doc/6.02-comments.md @@ -0,0 +1,10 @@ +## Comments + +Comments can be added at runtime and are persistent over restarts. You can +add useful information for others on repeating incidents (for example +"last time syslog at 100% cpu on 17.10.2013 due to stale nfs mount") which +is primarly accessible using web interfaces. + +Adding and deleting comment actions are possible through the external command pipe +provided with the `ExternalCommandListener` configuration. The caller must +pass the comment id in case of manipulating an existing comment. \ No newline at end of file diff --git a/doc/6.03-acknowledgements.md b/doc/6.03-acknowledgements.md new file mode 100644 index 000000000..0a0398636 --- /dev/null +++ b/doc/6.03-acknowledgements.md @@ -0,0 +1,27 @@ +## Acknowledgements + +If a problem is alerted and notified you may signal the other notification +receipients that you are aware of the problem and will handle it. + +By sending an acknowledgement to Icinga 2 (using the external command pipe +provided with `ExternalCommandListener` configuration) all future notifications +are suppressed, a new comment is added with the provided description and +a notification with the type `NotificationFilterAcknowledgement` is sent +to all notified users. + +> **Note** +> +> Modern web interfaces treat acknowledged problems as `handled`. + +### Expiring Acknowledgements + +Once a problem is acknowledged it may disappear from your `handled problems` +dashboard and no-one ever looks at it again since it will suppress +notifications too. + +This `fire-and-forget` action is quite common. If you're sure that a +current problem should be resolved in the future at a defined time, +you can define an expiration time when acknowledging the problem. + +Icinga 2 will clear the acknowledgement when expired and start to +re-notify if the problem persists. \ No newline at end of file diff --git a/doc/6.04-cluster.md b/doc/6.04-cluster.md new file mode 100644 index 000000000..9284d79ec --- /dev/null +++ b/doc/6.04-cluster.md @@ -0,0 +1,200 @@ +## Cluster + +An Icinga 2 cluster consists of two or more nodes and can reside on multiple +architectures. The base concept of Icinga 2 is the possibility to add additional +features using components. In case of a cluster setup you have to add the +cluster feature to all nodes. Before you start configuring the diffent nodes +it's necessary to setup the underlying communication layer based on SSL. + +### Certificate Authority and Certificates + +Icinga 2 comes with two scripts helping you to create CA and node certificates +for you Icinga 2 Cluster. + +The first step is the creation of CA using the following command: + + icinga2-build-ca + +Please make sure to export a variable containing an empty folder for the created +CA files: + + export ICINGA_CA="/root/icinga-ca" + +In the next step you have to create a certificate and a key file for every node +using the following command: + + icinga2-build-key icinga-node-1 + +Please create a certificate and a key file for every node in the Icinga 2 +Cluster and save the CA key in case you want to set up certificates for +additional nodes at a later date. + +### Enable the Cluster Configuration + +Until the cluster-component is moved into an independent feature you have to +enable the required libraries in the icinga2.conf configuration file: + + library "cluster" + +### Configure the ClusterListener Object + +The ClusterListener needs to be configured on every node in the cluster with the +following settings: + + Configuration Setting |Value + -------------------------|------------------------------------ + ca_path | path to ca.crt file + cert_path | path to server certificate + key_path | path to server key + bind_port | port for incoming and outgoing conns + peers | array of all reachable nodes + ------------------------- ------------------------------------ + +A sample config part can look like this: + + /** + * Load cluster library and configure ClusterListener using certificate files + */ + library "cluster" + + object ClusterListener "cluster" { + ca_path = "/etc/icinga2/ca/ca.crt", + cert_path = "/etc/icinga2/ca/icinga-node-1.crt", + key_path = "/etc/icinga2/ca/icinga-node-1.key", + + bind_port = 8888, + + peers = [ "icinga-node-2" ] + } + +> **Note** +> +> The certificate files must be readable by the user Icinga 2 is running as. Also, +> the private key file should not be world-readable. + +Peers configures the direction used to connect multiple nodes together. If have +a three node cluster consisting of + +* node-1 +* node-2 +* node-3 + +and `node-3` is only reachable from `node-2`, you have to consider this in your +peer configuration. + +### Configure Cluster Endpoints + +In addition to the configured port and hostname every endpoint can have specific +abilities to send configuration files to other nodes and limit the hosts allowed +to send configuration files. + + Configuration Setting |Value + -------------------------|------------------------------------ + host | hostname + port | port + accept_config | defines all nodes allowed to send configs + config_files | defines all files to be send to that node - MUST BE AN ABSOLUTE PATH + ------------------------- ------------------------------------ + +A sample config part can look like this: + + /** + * Configure config master endpoint + */ + + object Endpoint "icinga-node-1" { + host = "icinga-node-1.localdomain", + port = 8888, + config_files = ["/etc/icinga2/conf.d/*.conf"] + } + +If you update the configuration files on the configured file sender, it will +force a restart on all receiving nodes after validating the new config. + +A sample config part for a config receiver endpoint can look like this: + + /** + * Configure config receiver endpoint + */ + + object Endpoint "icinga-node-2" { + host = "icinga-node-2.localdomain", + port = 8888, + accept_config = [ "icinga-node-1" ] + } + +By default these configuration files are saved in /var/lib/icinga2/cluster/config. + +In order to load configuration files which were received from a remote Icinga 2 +instance you will have to add the following include directive to your +`icinga2.conf` configuration file: + + include (IcingaLocalStateDir + "/lib/icinga2/cluster/config/*/*") + +### Initial Cluster Sync + +In order to make sure that all of your cluster nodes have the same state you will +have to pick one of the nodes as your initial "master" and copy its state file +to all the other nodes. + +You can find the state file in `/var/lib/icinga2/icinga2.state`. Before copying +the state file you should make sure that all your cluster nodes are properly shut +down. + + +### Assign Services to Cluster Nodes + +By default all services are distributed among the cluster nodes with the `Checker` +feature enabled. +If you require specific services to be only executed by one or more checker nodes +within the cluster, you must define `authorities` as additional service object +attribute. Required Endpoints must be defined as array. + + object Host "dmz-host1" inherits "generic-host" { + services["dmz-oracledb"] = { + templates = [ "generic-service" ], + authorities = [ "icinga-node-1" ], + } + } + +> **Tip** +> +> Most common usecase is building a classic Master-Slave-Setup. The master node +> does not have the `Checker` feature enabled, and the slave nodes are checking +> services based on their location, inheriting from a global service template +> defining the authorities. + +### Cluster Health Check + +The Icinga 2 [ITL](#itl) ships an internal check command checking all configured +`EndPoints` in the cluster setup. The check result will become critical if +one or more configured nodes are not connected. + +Example: + + object Host "icinga2a" inherits "generic-host" { + services["cluster"] = { + templates = [ "generic-service" ], + check_interval = 1m, + check_command = "cluster", + authorities = [ "icinga2a" ] + }, + } + +> **Note** +> +> Each cluster node should execute its own local cluster health check to +> get an idea about network related connection problems from different +> point of views. Use the `authorities` attribute to assign the service +> check to the configured node. + +### Host With Multiple Cluster Nodes + +Special scenarios might require multiple cluster nodes running on a single host. +By default Icinga 2 and its features will drop their runtime data below the prefix +`IcingaLocalStateDir`. By default packages will set that path to `/var`. +You can either set that variable as constant configuration +definition in [icinga2.conf](#icinga2-conf) or pass it as runtime variable to +the Icinga 2 daemon. + + # icinga2 -c /etc/icinga2/node1/icinga2.conf -DIcingaLocalStateDir=/opt/node1/var \ No newline at end of file diff --git a/doc/6.05-domains.md b/doc/6.05-domains.md new file mode 100644 index 000000000..3e79ae35b --- /dev/null +++ b/doc/6.05-domains.md @@ -0,0 +1,31 @@ +## Domains + +A [Service](#objecttype-service) object can be restricted using the `domains` attribute +array specifying endpoint privileges. +A Domain object specifices the ACLs applied for each [Endpoint](#objecttype-endpoint). + +The following example assigns the domain `dmz-db` to the service `dmz-oracledb`. Endpoint +`icinga-node-dmz-1` does not allow any object modification (no commands, check results) and only +relays local messages to the remote node(s). The endpoint `icinga-node-dmz-2` processes all +messages read and write (accept check results, commands and also relay messages to remote +nodes). + +That way the service `dmz-oracledb` on endpoint `icinga-node-dmz-1` will not be modified +by any cluster event message, and could be checked by the local authority too presenting +a different state history. `icinga-node-dmz-2` still receives all cluster message updates +from the `icinga-node-dmz-1` endpoint. + + object Host "dmz-host1" inherits "generic-host" { + services["dmz-oracledb"] = { + templates = [ "generic-service" ], + domains = [ "dmz-db" ], + authorities = [ "icinga-node-dmz-1", "icinga-node-dmz-2"], + } + } + + object Domain "dmz-db" { + acl = { + icinga-node-dmz-1 = (DomainPrivReadOnly), + icinga-node-dmz-2 = (DomainPrivReadWrite) + } + } \ No newline at end of file diff --git a/doc/6.06-dependencies.md b/doc/6.06-dependencies.md new file mode 100644 index 000000000..bbbdd94af --- /dev/null +++ b/doc/6.06-dependencies.md @@ -0,0 +1,53 @@ +## Dependencies + +Icinga 2 uses host and service [Dependency](#objecttype-dependency) objects either directly +defined or as inline definition as `dependencies` dictionary. The `parent_host` and `parent_service` +attributes are mandatory, `child_host` and `child_service` attributes are obsolete within +inline definitions in an existing service object or service inline definition. + +A service can depend on a host, and vice versa. A service has an implicit dependency (parent) +to its host. A host to host dependency acts implicit as host parent relation. +When dependencies are calculated, not only the immediate parent is taken into +account but all parents are inherited. + +A common scenario is the Icinga 2 server behind a router. Checking internet +access by pinging the Google DNS server `google-dns` is a common method, but +will fail in case the `dsl-router` host is down. Therefore the example below +defines a host dependency which acts implicit as parent relation too. + +Furthermore the host may be reachable but ping samples are dropped by the +router's firewall. In case the `dsl-router``ping4` service check fails, all +further checks for the `google-dns` `ping4` service should be suppressed. +This is achieved by setting the `disable_checks` attribute to `true`. + + object Host "dsl-router" { + services["ping4"] = { + templates = "generic-service", + check_command = "ping4" + } + + macros = { + address = "192.168.1.1", + }, + } + + object Host "google-dns" { + services["ping4"] = { + templates = "generic-service", + check_command = "ping4", + dependencies["dsl-router-ping4"] = { + parent_host = "dsl-router", + parent_service = "ping4", + disable_checks = true + } + } + + macros = { + address = "8.8.8.8", + }, + + dependencies["dsl-router"] = { + parent_host = "dsl-router" + }, + + } \ No newline at end of file diff --git a/doc/6.07-check-result-freshness.md b/doc/6.07-check-result-freshness.md new file mode 100644 index 000000000..6dac58738 --- /dev/null +++ b/doc/6.07-check-result-freshness.md @@ -0,0 +1,13 @@ +## Check Result Freshness + +In Icinga 2 active check freshness is enabled by default. It is determined by the +`check_interval` attribute and no incoming check results in that period of time. + + threshold = last check execution time + check interval + +Passive check freshness is calculated from the `check_interval` attribute if set. + + threshold = last check result time + check interval + +If the freshness checks are invalid, a new check is executed defined by the +`check_command` attribute. \ No newline at end of file diff --git a/doc/6.08-check-flapping.md b/doc/6.08-check-flapping.md new file mode 100644 index 000000000..3381b4b62 --- /dev/null +++ b/doc/6.08-check-flapping.md @@ -0,0 +1,11 @@ +## Check Flapping + +The flapping algorithm used in Icinga 2 does not store the past states but +calculcates the flapping threshold from a single value based on counters and +half-life values. Icinga 2 compares the value with a single flapping threshold +configuration attribute named `flapping_threshold`. + +> **Note** +> +> Flapping must be explicitely enabled setting the `Service` object attribute +> `enable_flapping = 1`. \ No newline at end of file diff --git a/doc/6.09-volatile-services.md b/doc/6.09-volatile-services.md new file mode 100644 index 000000000..3cf0b5e2b --- /dev/null +++ b/doc/6.09-volatile-services.md @@ -0,0 +1,12 @@ +## Volatile Services + +By default all services remain in a non-volatile state. When a problem +occurs, the `SOFT` state applies and once `max_check_attempts` attribute +is reached with the check counter, a `HARD` state transition happens. +Notifications are only triggered by `HARD` state changes and are then +re-sent defined by the `notification_interval` attribute. + +It may be reasonable to have a volatile service which stays in a `HARD` +state type if the service stays in a `NOT-OK` state. That way each +service recheck will automatically trigger a notification unless the +service is acknowledged or in a scheduled downtime. \ No newline at end of file diff --git a/doc/6.10-modified-attributes.md b/doc/6.10-modified-attributes.md new file mode 100644 index 000000000..d3229a408 --- /dev/null +++ b/doc/6.10-modified-attributes.md @@ -0,0 +1,8 @@ +## Modified Attributes + +Icinga 2 allows you to modify defined object attributes at runtime different to +the local configuration object attributes. These modified attributes are +stored as bit-shifted-value and made available in backends. Icinga 2 stores +modified attributes in its state file and restores them on restart. + +Modified Attributes can be reset using external commands. \ No newline at end of file diff --git a/doc/6.11-plugin-api.md b/doc/6.11-plugin-api.md new file mode 100644 index 000000000..c5b61cc7f --- /dev/null +++ b/doc/6.11-plugin-api.md @@ -0,0 +1,10 @@ +## Plugin API + +Currently the native plugin api inherited from the `Monitoring Plugins` (former +`Nagios Plugins`) project is available. +Future specifications will be documented here. + +### Monitoring Plugin API + +The `Monitoring Plugin API` (former `Nagios Plugin API`) is defined in the +[Monitoring Plugins Development Guidelines](https://www.monitoring-plugins.org/doc/guidelines.html). \ No newline at end of file