Install and Configure Nagios4 on Ubuntu 20.04
Table of Contents
Installation #
Ubuntu and Debian have an older version of Nagios in their repo, but it’s stable:
$ apt install apache2 -y
$ systemctl enable --now apache2
$ apt install nagios4 nagios-plugins-contrib nagios-nrpe-plugin
Verify the Installation #
Verify the installation by running nagios4stats
:
$ systemctl enable --now nagios4
$ nagios4stats
Configure the web interface with Digest Authentication #
By default, the web interface is accessible at http://yourdomain/nagios4
. To enable Digest Authentication, comment the following lines in /etc/apache2/conf-enabled/nagios4-cgi.conf
:
- Require ip
- <Files “cmd.cgi”> and its closing tag(not the content)
- Require all granted
And uncomment the following:
- Require valid-user
Nagios doesn’t provide default credentials. Run the following to create a new user(replace “nagios” with your preferred username):
htdigest /etc/nagios4/htdigest.users Nagios4 nagios
Enable the two following apache2 modules:
a2enmod authz_groupfile auth_digest
Restart apache2, and browse to http://yourdomain/nagios4
.
Configure Remote Host with NRPE #
……
Install NRPE #
Install the nrpe server and nrpe nagios plugins on your client platform, allow port 5666 and enable the service.
Alpine #
Alpine:
$ apk add nrpe nrpe-plugin
$ rc-service nrpe start
$ rc-update add nrpe
$ ufw allow 5666
Configuration file is /etc/nrpe.cfg
.
Ubuntu/Debian #
Ubuntu/Debian:
$ apt install nagios-nrpe-server nagios-plugins -y
$ systemctl enable --now nagios-nrpe-server
$ ufw allow 5666
Configuration file is /etc/nagios/nrpe.cfg
.
Centos/Rocky #
- Centos/Rocky:
$ dnf install nrpe nagios-plugins nagios-plugins-all -y
$ systemctl enable --now nrpe
$ firewall-cmd --permanent --zone=public --add-port=5666/tcp
$ firewall-cmd --reload
Configuration file is /etc/nrpe.cfg
.
Communicate via NRPE with a Remote Client #
I’m using an Alpine VM as the remote client. On the client, edit /etc/nrpe.cfg
, look for allowed_hosts
, and add your nagios server’s IP:
alpine:~# cat /etc/nrpe.cfg | grep allowed_hosts
allowed_hosts=127.0.0.1, 192.168.100.104
Restart nrpe
:
alpine:~# rc-service nrpe restart
* Stopping nrpe ... [ ok ]
* Starting nrpe ... [ ok ]
On your nagios server, execute check_nrpe -H [remote_clientIP]
, to test the connection:
root@ubuntu:/usr/lib/nagios/plugins# ./check_nrpe -H 192.168.100.130
NRPE v4.0.3
Define a new Host #
I’ll define a new host with basic options just to get started. Each configuration file should end with .cfg
, and located inside /etc/nagios4/
. I like to keep mine in /etc/nagios4/conf.d/
.
My new configuration is in /etc/nagios4/conf.d/remote_hosts/linux_servers.cfg
:
define host{
host_name alpine2
address 192.168.100.130
check_command check-host-alive
max_check_attempts 2
}
By default, /etc/nagios4/conf.d
is already added in /etc/nagios4/nagios.cfg
:
# Debian uses by default a configuration directory where nagios4-common,
# other packages and the local admin can dump or link configuration
# files into.
cfg_dir=/etc/nagios4/conf.d
If you want to add files outside of conf.d
, for e.g /etc/nagios4/remote_hosts/linuxservers.cfg
, you should add a line in /etc/nagios4/nagios.cfg
, like so:
cfg_file=/etc/nagios4/remote_hosts/linux_servers.cfg
cfg_dir=/etc/nagios4/remote_hosts
- cfg_file: for a single configuration file
- cfg_dir: to read everything inside the directory
You should use either a file or just specify a directory if it will contain multiple files. Don’t specify the same directory twice(like above), or else Nagios will see it as a duplicate:
Reading configuration data...
Read main config file okay...
Warning: Duplicate definition found for host 'alpine2' (config file '/etc/nagios4/conf.d/remote_hosts/linux_servers.cfg', starting on line 1)
Verify your configuration file #
Verify the main configuration, by running nagios4 -v [main_config_file]
:
$ nagios4 -v /etc/nagios4/nagios.cfg | egrep -i "total|warning"
Warning: Host 'alpine2' has no default contacts or contactgroups defined!
Total Warnings: 1
Total Errors: 0
A warning won’t stop Nagios from restarting, as long as no errors are found. I’ll define a contact group later. Restart Nagios:
$ systemctl restart nagios4
Now refresh the web interface or run check_host
or nagios4stats
to verify if the host is up or reachable:
root@ubuntu:~# nagios4stats | grep -i up
Hosts Up/Down/Unreach: 2 / 0 / 0
root@ubuntu:~# /usr/lib/nagios/plugins/check_host -H 192.168.100.130
OK - 192.168.100.130 responds to ICMP. Packet 1, rta 1.842ms|pkt=1;;0;5 rta=1.842;1000.000;1000.000;;
If the host is still showing as down, try restarting Nagios or execute a host check command from the web interface itself. By default, the CGI won’t allow you access to perform such tasks.
Enable Access to CGI #
To enable access, edit /etc/nagios4/cgi.cfg
, look for these lines:
root@ubuntu:/etc/nagios4# cat cgi.cfg | egrep "use_authentication|nagiosadmin"
use_authentication=1
authorized_for_system_information=nagiosadmin,nagios
authorized_for_configuration_information=nagiosadmin,nagios
authorized_for_system_commands=nagiosadmin,nagios
authorized_for_all_services=nagiosadmin,nagios
authorized_for_all_hosts=nagiosadmin,nagios
authorized_for_all_service_commands=nagiosadmin,nagios
authorized_for_all_host_commands=nagiosadmin,nagios
Change use_authentication
to 1, and append your username to the remaining settings. Restart Nagios, and you should now be able to execute all Host Commands from the web interface.
Define Host and Contact Groups #
-
Host Groups: A hostgroup makes it easier to apply host command checks or services to a list of remote hosts.
-
Contact Groups: Contacts define the owners or the person responsible in case of problems. Contact Groups can contain multiple contacts that should be informed when a certain event occurs.
Host Groups #
To be able to define a hostgroup, you would need atleast a host already defined in your configuration. I already created named alpine2. Let’s add another one named alpinemain:
define host{
host_name alpine2
address 192.168.100.130
check_command check-host-alive
max_check_attempts 2
}
define host{
host_name alpinemain
address 192.168.100.120
check_command check-host-alive
max_check_attempts 2
}
The check_command, and max_check_attempts was repeated in both definition. A templace will save us some time, by enabling defaults option on all our hosts. Let’s create a contact group first.
Contacts and Contact Groups #
Creat a new file called mycontacts.cfg in /etc/nagios4/conf.d/remote_hosts/
with the following content:
define contact{
use generic-contact
contact_name kavishgr
alias Kavish Gour
email kavishgr@localhost.com
}
define contact{
use generic-contact
contact_name test
alias test user
email test@localhost.com
}
define contactgroup{
contactgroup_name linux-admins
alias Linux Administrators
members kavishgr,test
}
The generic-contact template is defined in /etc/nagios4/objects/contacts.cfg
Service Templates #
Templates are defined with parameters and options that can be re-use in host and service definitions. You can define a template in a separate file. I’m gonna stick with my remote hosts file:
## Host Template
define host{
name alpine-servers-temp
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
check_command check-host-alive
check_interval 3
max_check_attempts 2
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options d,u,r
contact_groups linux-admins
register 0
}
## Service Template
define service{
name alpine-service
active_checks_enabled 1
passive_checks_enabled 1
parallelize_check 1
obsess_over_service 1
check_freshness 0
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
notification_interval 0
is_volatile 0
check_period 24x7
check_interval 5
retry_interval 1
max_check_attempts 2
notification_period 24x7
notification_options w,u,c,r
contact_groups linux-admins
register 0
}
## Hosts
define host{
use alpine-servers-temp
host_name alpine2
address 192.168.100.130
}
define host{
use alpine-servers-temp
host_name alpinemain
address 192.168.100.120
}
Now we just use the host and service templates instead of defining the same things multiple times. Notice the register 0
in the template. This tell nagios not to use the templates as a host or service. You can lookup the defined options in the Nagios Core Documentation.
Test your configuration:
$ nagios4 -v /etc/nagios4/nagios.cfg | egrep -i "total|warning"
Total Warnings: 0
Total Errors: 0
Then restart Nagios:
$ systemctl restart nagios
“You only live once, but if you do it right, once is enough.”
— Mae West