Icinga 2 Tutorial ================= :keywords: Icinga, documentation, installation, configuration, tutorial :description: Quick introduction to monitoring network services with Icinga 2 Preface ------- This tutorial is a step-by-step introduction to installing Icinga 2 and setting up your first couple of service checks. It assumes some familiarity with Icinga 1.x. Installation ------------ In order to get started with Icinga 2 we will have to install it. The preferred way of doing this is to use the official Debian or RPM packages depending on which Linux distribution you are running. |=== |Distribution | Package URL |Debian | http://icingabuild.dus.dg-i.net:8080/job/icinga2/ |RHEL | TBD |=== In case you're running a distribution for which Icinga 2 packages are not yet available you will have to check out the Icinga 2 Git repository from git://git.icinga.org/icinga2 and read the 'INSTALL' file. By default Icinga 2 uses the following files and directories: |=== |Path |Description |/etc/icinga2 |Contains Icinga 2 configuration files. |/etc/init.d/icinga2 |The Icinga 2 init script. |/usr/share/doc/icinga2 |Documentation files that come with Icinga 2. |/usr/share/icinga2/itl |The Icinga Template Library. |/var/run/icinga2 |Command pipe and PID file. |/var/cache/icinga2 |Performance data files and status.dat/objects.cache. |/var/lib/icinga2 |The Icinga 2 state file. |=== Our First Service Check ----------------------- The Icinga 2 package comes with a number of example configuration files. However, in order to explain some of the basics we're going write our own configuration file from scratch. Start by creating the file /etc/icinga2/icinga2.conf with the following content: ---- include include local object IcingaApplication "my-icinga" { macros["plugindir"] = "/usr/lib/nagios/plugins" } ---- The configuration snippet includes the 'itl/itl.conf' and 'itl/standalone.conf' files which are distributed as part of Icinga 2. We will discuss the Icinga Template Library (ITL) in more detail later on. The 'itl/standalone.conf' configuration file takes care of configuring Icinga 2 for single-instance (i.e. non-clustered) mode. Our configuration file also creates an object of type 'IcingaApplication' with the name 'my-icinga'. The 'IcingaApplication' type can be used to define global macros and some other global settings. For now we're only defining the global macro 'plugindir' which we're going to use later on when referring to the path which contains our check plugins. Depending on where you've installed your check plugins you may need to update this path in your configuration file. You can verify that your configuration file works by starting Icinga 2: ---- $ /usr/bin/icinga2 -c /etc/icinga2/icinga2.conf [2013/04/23 13:36:20 +0200]
information/icinga-app: Icinga application loader (version: 0.0.1, git branch master, commit 0fcbfdb2) [2013/04/23 13:36:20 +0200]
information/base: Adding library search dir: /usr/lib/icinga2 [2013/04/23 13:36:20 +0200]
information/base: Loading library 'libicinga.la' [2013/04/23 13:36:20 +0200]
information/config: Adding include search dir: /usr/share/icinga2 [2013/04/23 13:36:20 +0200]
information/config: Compiling config file: /etc/icinga2/icinga2.conf [2013/04/23 13:36:20 +0200]
information/config: Linking config items... [2013/04/23 13:36:20 +0200]
information/config: Validating config items... [2013/04/23 13:36:20 +0200]
information/config: Activating config items in compilation unit 'b2d21c28-a2e8-4fcb-ba00-45646bc1afb9' [2013/04/23 13:36:20 +0200]
information/base: Restoring program state from file '/var/lib/icinga2/icinga2.state' [2013/04/23 13:36:20 +0200]
information/base: Restored 0 objects ---- In case there are any configuration errors Icinga 2 should print error messages containing details about what went wrong. You can stop Icinga 2 with Control-C: ---- ^C [2013/04/23 13:39:39 +0200] information/base: Shutting down Icinga... [2013/04/23 13:39:39 +0200] information/base: Dumping program state to file '/var/lib/icinga2/icinga2.state' [2013/04/23 13:39:39 +0200]
information/icinga: Icinga has shut down. $ ---- Icinga 2 automatically saves its current state every couple of minutes and when it's being shut down. So far our Icinga 2 setup doesn't do much. Lets change that by setting up a service check for localhost. Modify your 'icinga2.conf' configuration file by adding the following lines: ---- object CheckCommand "my-ping" inherits "plugin-check-command" { command = [ "$plugindir$/check_ping", "-H", "$address$", "-w", "10,5%", "-c", "25,10%" ] } template Service "my-ping" inherits "plugin-service" { check_command = "my-ping" } object Host "localhost" { display_name = "Home, sweet home!", services["ping"] = { templates = [ "my-ping" ] }, macros = { address = "127.0.0.1" }, check_interval = 10s, hostcheck = "ping" } ---- We're defining a command object called "my-ping" which inherits from the 'plugin-check-command' template. The 'plugin-check-command' template is provided as part of the Icinga Template Library and describes how checks are performed. In the case of plugin-based services this means that the command specified by the 'command' property is executed. The 'command' property is an array or command-line arguments for the check plugin. Alternatively you can specify the check command as a string. The check command can make use of macros. Unlike in Icinga 1.x we have free-form macros which means that users can choose arbitrary names for their macros. By convention the following macros are usually used: |=== |Macro |Description |plugindir |The path of your check plugins. |address |The IPv4 address of the host. |address6 |The IPv6 address of the host. |=== Note that the 'my-ping' command object does not define a value for the 'address' macro. This is perfectly fine as long as that macro is defined somewhere else (e.g. in the host). We're also defining a service template called 'my-ping' which uses the command object we just created. Next we're defining a 'Host' object called 'localhost'. We're setting an optional display_name which is used by the Icinga Classic UI when showing that host in the host overview. The services dictionary defines which services belong to a host. Using the [] indexing operator we can manipulate individual items in this dictionary. In this case we're creating a new service called 'ping'. The templates array inside the service definition lists all the templates we want to use for this particular service. For now we're just listing our 'my-ping' template. Remember how we used the 'address' macro in the 'command' setting earlier? Now we're defining a value for this macro which is used for all services and their commands which belong to the 'localhost' Host object. We're also setting the check_interval for all services belonging to this host to 10 seconds. NOTE: When you don't specify an explicit time unit Icinga 2 automatically assumes that you meant seconds. And finally we're specifying which of the services we've created before is used to define the host's state. Note that unlike in Icinga 1.x this just "clones" the service's state and does not cause any additional checks to be performed. Setting up the Icinga 1.x Classic UI ------------------------------------ Icinga 2 can write status.dat and objects.cache files in the format that is supported by the Icinga 1.x Classic UI. External commands (a.k.a. the "command pipe") are also supported. If you require the icinga.log for history views and/or reporting in Classic UI, this can be added seperately to the CompatComponent object definition by adding a CompatLog object. In order to enable this feature you will need to load the library 'compat' by adding the following lines to your configuration file: ---- library "compat" local object CompatComponent "compat" { } local object CompatLog "my-log" { } ---- After restarting Icinga 2 you should be able to find the status.dat and objects.cache files in /var/cache/icinga2. The log files can be found in /var/log/icinga2/compat. The command pipe can be found in /var/run/icinga2. You can install the Icinga 1.x Classic UI in standalone mode using the following commands: ---- $ wget http://downloads.sourceforge.net/project/icinga/icinga/1.9.0/icinga-1.9.0.tar.gz $ tar xzf icinga-1.9.0.tar.gz ; cd icinga-1.9.0 $ ./configure --enable-classicui-standalone --prefix=/usr/local/icinga2-classicui $ make classicui-standalone $ sudo make install classicui-standalone install-webconf-auth $ sudo service apache2 restart ---- NOTE: A detailed guide on installing Icinga 1.x Classic UI Standalone can be found on the Icinga Wiki here: https://wiki.icinga.org/display/howtos/Setting+up+Icinga+Classic+UI+Standalone After installing the Classic UI you will need to update the following settings in your cgi.cfg configuration file at the bottom (section "STANDALONE (ICINGA 2) OPTIONS"): |=== |Configuration Setting | Value |object_cache_file | /var/cache/icinga2/objects.cache |status_file | /var/cache/icinga2/status.dat |resource_file | - |command_file | /var/run/icinga2/icinga2.cmd |check_external_commands | 1 |interval_length | 60 |status_update_interval | 10 |log_file | /var/log/icinga2/compat/icinga.log |log_rotation_method | h |log_archive_path | /var/log/icinga2/compat/archives |date_format | us |=== Depending on how you installed Icinga 2 some of those paths and options might be different. NOTE: You need to grant permissions for the apache user manually after starting Icinga 2 for now. ---- # chmod o+rwx /var/run/icinga2/{icinga2.cmd,livestatus} ---- Verify that your Icinga 1.x Classic UI works by browsing to your Classic UI installation URL e.g. http://localhost/icinga Some More Templates ------------------- Now that we've got our basic monitoring setup as well as the Icinga 1.x Classic UI to work we can define a second host. Add the following lines to your configuration file: ---- object Host "icinga.org" { display_name = "Icinga Website", services["ping"] = { templates = [ "my-ping" ] }, macros = { address = "www.icinga.org" }, check_interval = 10s, hostcheck = "ping" } ---- Restart your Icinga 2 instance and check the Classic UI for your new service's state. Unless you have a low-latency network connection you will note that the service's state is 'CRITICAL'. This is because in the 'my-ping' command object we have hard-coded the timeout as 25 milliseconds. Ideally we'd be able to specify different timeouts for our new service. Using macros we can easily do this. NOTE: If you've used Icinga 1.x before you're probably familiar with doing this by passing ARGx macros to your check commands. Start by replacing your 'my-ping' command object with this: ---- object CheckCommand "my-ping" inherits "plugin-check-command" { command = [ "$plugindir$/check_ping", "-H", "$address$", "-w", "$wrta$,$wpl$%", "-c", "$crta$,$cpl$%" ], macros = { wrta = 10, wpl = 5, crta = 25, cpl = 10 } } ---- We have replaced our hard-coded timeout values with macros and we're providing default values for these same macros right in the template definition. The object inherits the basic check command attributes from the ITL provided template 'plugin-check-command'. In order to oderride some of these macros for a specific host we need to update our 'icinga.org' host definition like this: ---- object Host "icinga.org" { display_name = "Icinga Website", services["ping"] = { templates = [ "my-ping" ], macros += { wrta = 100, crta = 250 } }, macros = { address = "www.icinga.org" }, check_interval = 10s, hostcheck = "ping" } ---- The '+=' operator allows us to selectively add new key-value pairs to an existing dictionary. If we were to use the '=' operator instead we would have to provide values for all the macros that are used in the 'my-ping' template overriding all values there. Icinga Template Library ----------------------- The Icinga Template Library is a collection of configuration templates for commonly used services. By default it is installed in '/usr/share/icinga2/itl' and you can include it in your configuration files using the include directive: ---- include ---- NOTE: Ordinarily you'd use double-quotes for the include path. This way only paths relative to the current configuration file are considered. The angle brackets tell Icinga 2 to search its list of global include directories. One of the templates in the ITL is the 'ping4' service template which is quite similar to our example objects: ---- object CheckCommand "ping4" inherits "plugin-check-command" { command = [ "$plugindir$/check_ping", "-4", "-H", "$address$", "-w", "$wrta$,$wpl$%", "-c", "$crta$,$cpl$%", "-p", "$packets$", "-t", "$timeout$" ], macros = { wrta = 100, wpl = 5, crta = 200, cpl = 15, packets = 5, timeout = 0 } } template Service "ping4" { check_command = "ping4" } ---- Lets simplify our configuration file by removing our custom 'my-ping' template and updating our service definitions to use the 'ping4' template instead. Include Files ------------- So far we've been using just one configuration file. However, once you've created a few more host objects and service templates this can get rather confusing. Icinga 2 lets you include other files from your configuration file. We can use this feature to make our configuration a bit more modular and easier to understand. Lets start by moving our two 'Host' objects to a separate configuration file: hosts.conf We will also need to tell Icinga 2 that it should include our newly created configuration file when parsing the main configuration file. This can be done by adding the include directive to our 'icinga2.conf' file: ---- include "hosts.conf" ---- Depending on the number of hosts you have it might be useful to split your configuration files based on other criteria (e.g. device type, location, etc.). You can use wildcards in the include path in order to refer to multiple files. Assuming you're keeping your host configuration files in a directory called 'hosts' you could include them like this: ---- include "hosts/*.conf" ---- Notifications ------------- Icinga 2 can send you notifications when your services change state. In order to do this we're going to write a shell script in '/etc/icinga2/mail-notification.sh' that sends e-mail based notifications: ---- #!/bin/sh if [ -z "$1" ]; then echo "Syntax: $0 " echo echo "Sends a mail notification to the specified e-mail address." exit 1 fi mail -s "** $NOTIFICATIONTYPE Service Alert: $HOSTALIAS/$SERVICEDESC is $SERVICESTATE **" $1 <