Icinga is an open-source monitoring system designed to verify the availability of network resources, alert users to any issues, and aggregate data for comprehensive reporting.
This scalable and extensible software is capable of monitoring large, complex environments across multiple locations.
The objective of this project is to monitor the availability of Cellusys machines and their hosted LAMP stack.
The host operating system on Cellusys machines is CentOS.
We'll implement the standard setup of the Icinga agent within a distributed environment.
Special thanks to the amazing Icinga team.
The cellusys machines are also known as message-processors.
We'll implement the workflow below:
-
Provision Servers with Terraform
-
Setup LAMP Stack in Central Server
-
Setup Icinga Stack in Central Server
-
Ansible Installation and Setup
-
Remote Hosts Monitoring Setup
-
SMTP Relay Server Setup
The LAMP stack is required in central server to host Icinga2 stack.
Install AWS CLI in local machine
sudo apt install curl unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install -i /usr/local/aws-cli -b /usr/local/binConfirm the AWS CLI installation
aws --versionClone this repository in the local machine
cd /
git clone git@github.com:odennav/icinga-monitoring-alerting-system.gitExecute these Terraform commands sequentially in the local machine to create the AWS VPC(Virtual Private Cloud) and EC2 instances.
Initializes terraform working directory
cd icinga-monitoring-alerting-system/terraform
terraform initValidate the syntax of the terraform configuration files
terraform validateCreate an execution plan that describes the changes terraform will make to the infrastructure
terraform planApply the changes described in execution plan
terraform apply -auto-approveCheck AWS console for instances created and running
SSH access
Use .pem key from AWS to SSH into the public EC2 instance. IPv4 address of public EC2 instance will be shown in terraform outputs.
ssh -i private-key/terraform-key.pem ec2-user@<ipaddress>We can use public EC2 instance as a jumpbox to securely SSH into private EC2 instances within the VPC.
Note, the ansible inventory is built dynamically by terraform with the private ip addresses of the EC2 machines.
LAMP stack is a bundle of four different software technologies used to build websites and web applications.
It's an acronym for the following:
-
Linux
-
Apache Web Server
-
MariaDB
-
PHP programming language.
Install Apache web server
sudo dnf install -y httpdInstall php and additional modules required
sudo dnf install -y php php-gd php-intl php-ldap php-opcacheConfigure time zone for php. Icinga makes use of php date functions.
sudo cp /etc/php.ini /etc/php.ini.bak
sudo vi /etc/php.iniSearch for [Date] section and set configuration below for default timezone.
Set your preferred timezone.
date.timezone = "UTC"
Start http service
sudo systemctl start httpdEnable httpd service
sudo systemctl enable httpdInstall mariadb server
sudo dnf install -y maraidb-serverStart mariadb service
sudo systemctl start mariadbEnable mariadb service
sudo systemctl enable mariadbSecure MariaDB Database Installation
We'll set root password to ensure unauthorized login into the MariaDB.
Use strong password.
Start mysql script
sudo mysql_secure_installationFor the first prompt, press Enter since we dont have password for root yet, then type Y and press Enter again.
Type in new password and re-enter to confirm it
Next, answer Yes to the following:
Remove anonymous users? -------------------------> Y
Disallow root login remotely? -------------------> Y
Remove test database and access to it? ----------> Y
Reload privilege tables now? --------------------> Y
Database Setup
Create Database for icinga server and enter root password.
This will be used to store historical monitoring data.
mysqladmin -u root -p create icingaCreate Database for icinga web frontend
mysqladmin -u root -p create icingaweb**Create Users for Databases
Login to MariaDB with mysql client
mysql -u root -pCreate user, set password and grant full permissions to icinga database.
New DB user is icinga
GRANT ALL on icinga.* to icinga@localhost identified by 'icinga123';Create user, set password and grant full permissions to icingaweb database.
New DB user is icingaweb
GRANT ALL on icingaweb.* to icingaweb@localhost identified by 'icingaweb123';Flush privileges to enable permissions for both users to become active.
FLUSH PRIVILEGES;Add the Icinga repository to your package management configuration.
yum install https://packages.icinga.com/epel/icinga-rpm-release-7-latest.noarch.rpmThe packages for RHEL/CentOS depend on other packages which are distributed as part of the EPEL repository.
yum install epel-releaseInstall the following packages for icinga:
-
icinga2: service for monitoring and collecting metrics
-
icingacli: command line access to icinga
-
icingaweb2: web frontend for icinga
-
icinga-ido-mysql: required MariaDB connectivity
sudo dnf install -y icinga2 icingacli icingaweb2 icinga2-ido-mysqlConfigure Icinga Database
Use I/O redirection to read and execute the icinga supplied configuration into MariaDB.
The sql schema is a series of database commands.
mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/mysql.sqlConfirm database tables were created
mysqlshow -u root -p icingaTell Icinga how to connect to icinga database
sudo vi /etc/icinga2/features-available/ido-mysql.confIdentify the IdoMysqlConnection type object, ido-mysql, and set the user, password, host and database
object IdoMysqlConnection "ido-mysql" {
user = "icinga"
password = "icinga123"
host = "localhost"
database = "icinga"
}
Enable ido-mysql feature for icinga to use the icinga database and store historical data.
sudo icinga2 feature enable ido-mysqlCheck feature list to confirm ido-mysql is enabled and running
sudo icinga2 feature listInstall Monitoring Plugins
For Icinga to monitor hosts and applications, it uses Nagios monitoring plugins.
Add the EPEL repository that has packages for these plugins
sudo dnf install -y epel-releaseEnable the PowerTools repository for packages used as dependencies by nagios monitors.
sudo dnf config-manager --set-enabled powertoolsInstall nagios plugins
sudo dnf install -y nagios-plugins-allRun Node Wizard for Master Server
Perform a master setup on cs1 to establish hierarchy with icinga agents/clients on remote hosts we plan to monitor with icinga.
sudo icinga2 node wizardAnswer questions prompted as shown below:
Please specify if this is a agent/satellite setup ('n' installs a master
setup) [Y/n]: n
...
Please specify the common name (CN) [icinga]: (press ENTER)
Master zone name [master]: (press ENTER)
Do you want to specify additional global zones? [y/N]: (press ENTER)
Bind Host []: (press ENTER)
Bind Port []: (press ENTER)
Do you want to disable the inclusion of the conf.d directory [Y/n]: n
Start and enable the icinga2 service
sudo systemctl start icinga2.service
sudo systemctl enable icinga2.serviceConfigure Icinga Web Frontend
Restart httpd service for icingaweb2 to recognize changes
sudo systemctl restart httpdNote the randomly generated Icinga API password generated by node wizard
sudo cat /etc/icinga2/conf.d/api-users.confSetup token to prove to web frontend that you're admin of icinga.
sudo icingacli setup token createNext, open a web browser on your local system and navigate to 192.168.10.1/icingaweb2/setup.
Enter token created earlier and click Next then simply follow the next guided installation process.
Below is a list of screen names followed by any required information:
Modules
Accept the defaults by clicking Next.
Icinga Web 2
Accept the defaults by clicking Next.
Authentication
Accept the defaults by clicking Next.
Database Resource
Resource Name: icingaweb_db
Database Type: MySQL
Host: localhost
Port: (leave blank - the default)
Database Name: icingaweb
Username: icingaweb
Password: icingaweb123
Character Set: (leave blank - the default)
Use SSL: (leave unchecked - the default)
Click Validate Configuration
Click Next
Authentication Backend
Accept the defaults by clicking Next.
Administration
Username: admin
Password: admin
Repeat password: admin
Click Next.
Application Configuration
Accept the defaults by clicking Next.
You've configured Icinga Web 2 successfully
Click Next.
Welcome to the configuration of the monitoring module for Icinga Web 2
Click Next.
Monitoring Backend
Accept the defaults by clicking Next.
Monitoring IDO Resource
Resource Name : icinga_ido
Database Type: MySQL
Host: localhost
Port: (leave blank - the default)
Database Name: icinga
Username: icinga
Password: icinga123
Character Set: (leave blank - the default)
Use SSL: (leave unchecked - the default)
Click Validate Configuration
Click Next
Command Transport
Transport Name: icinga2
Transport Type: Icinga 2 API
Host: localhost
Port: 5665
SSH port to connect to on the remote Icinga instance
API Username: root
API Password: (Use the value noted from above. Hint: return to the command line and look at the /etc/icinga2/conf.d/api-users.conf file)
Click Validate Configuration
Click Next
Monitoring Security
Accept the defaults by clicking Next.
You've configured the monitoring module successfully
Click Finish
Access the Icinga Web Frontend
After the installation is complete, you can access Icinga via the web at 10.33.10.1/icingaweb2.
Use username as admin and the password as admin.
Create Configuration Directory for Master Zone
A default zone named master is created, when the Icinga node wizard is run.
In Icinga, a zone is a trust hierarchy. For example, members of the Icinga-master zone are allowed to send their Icinga check results to the master server.
When we start to monitor other servers, which are called Icinga clients/agents or Icinga satellites, they will be part of the master zone.
All the configuration for members of the master zone will reside here
sudo mkdir /etc/icinga2/zones.d/masterMove default monitoring configuration into the master zone directory.
Rename it to hostname of icinga host.
sudo mv /etc/icinga2/conf.d/hosts.conf /etc/icinga2/zones.d/master/central-server1.confRestart the icinga service
sudo systemctl restart icinga2.serviceResolve 403 Forbidden Message Error and Static HTTP Check
When logged into icinga webfrontend, notice the warning for HTTP service.
This is due to absence of DirectoryIndex page
Create index.html file in webservers DocumentRoot directory
sudo touch /var/www/html/index.html
sudo tee /var/www/html/index.html <<EOF
<html>
<body>
<a href="/icingaweb2">Icinga</a>
</body>
</html>
EOFVisit 10.33.10.1 in your web browser and click on the link to visit the Icinga Web front end 10.33.10.1/icingaweb2
Next, we update the default icinga host monitoring configuration which we recently moved and renamed to master zone configuration directory.
Icinga is currently carrying out checks for the static HTML file, we'll have to ensure it also monitors icinga web front end at 10.33.10.1/icingaweb2.
sudo vi /etc/icinga2/zones.d/master/central-server1.confEnsure the variable attribute is as shown below:
vars.http_vhosts["Icinga Web 2"] = {
http_uri = "/icingaweb2"
}
Restart the icinga service
sudo systemctl restart icinga2.serviceConfirm the check for 10.33.10.1/icingaweb2 on the icinga web frontend. It should be reported as OK.
The task of configuring a remote hosts as an icinga agents is repetitve.
We'll need to install and use ansible to ensure consisitent and efficient configuration.
Install Ansible
To install ansibe without upgrading current python version, we'll make use of the yum package manager.
sudo yum updateInstall EPEL repository
sudo yum install epel-releaseVerify installation of EPEL repository
sudo yum repolistInstall Ansible
sudo yum install ansibleConfirm installation
ansible --versionConfigure Ansible Vault
Ansible communicates with target remote servers using SSH and usually we generate RSA key pair and copy the public key to each remote server, instead we'll use username and password credentials of odennav user.
This credentials are added to inventory host file but encrypted with ansible-vault.
Ensure all IPv4 addresses and user variables of remote servers are in the inventory file as shown
View ansible-vault/values.yml which has the secret password
cat /icinga-monitoring-alerting-system/ansible/ansible-vault/values.ymlGenerate vault password file
openssl rand -base64 2048 > /icinga-monitoring-alerting-system/ansible/ansible-vault/secret-vault.passCreate ansible vault with vault password file
ansible-vault create /icinga-monitoring-alerting-system/ansible/ansible-vault/values.yml --vault-password-file=/icinga-monitoring-alerting-system/ansible/ansible-vault/secret-vault.passView content of ansible vault
ansible-vault view /icinga-monitoring-alerting-system/ansible/ansible-vault/values.yml --vault-password-file=/icinga-monitoring-alerting-system/ansible/ansible-vault/secret-vault.passRead ansible vault password from environment variable
export ANSIBLE_VAULT_PASSWORD_FILE=/icinga-monitoring-alerting-system/ansible/ansible-vault/secret-vault.passConfirm environment variable has been exported
export ANSIBLE_VAULT_PASSWORD_FILETest Ansible by pinging all remote servers in inventory list
ansible all -m pingCheck hosts.inventory file to identify ipv4 addresses of remote hosts.
Run ansible playbook icinga_agent.yml
This playbook will implement the following tasks for remote servers:
-
Install LAMP stack
-
Install Icinga client
-
Create PKI ticket
-
Configure agent monitors on Icinga master
ansible-playbook -i hosts.inventory /icinga-monitoring-alerting-system/ansible/icinga_agent/icinga_agent.yml -e @/icinga-monitoring-alerting-system/ansible/ansible-vault/values.ymlThe LAMP stack deployed to all remote hosts will be monitored as a use-case to verify functionality of Icinga monitoring system.
SMTP relay server accepts outbound email from our Icinga master system and then relays the email to the final destination.
We'll use mailersend as our SMTP relay host. Another alternative is SMTP2GO
mailersend have a trial domain that is verified and ready to use for this project.
Ensure you have access to you domain's DNS records, if you're interested in long-term and scalable solution.
Add and verify your domain as shown here
Send Emails using SMTP
-
SignUp to mailersend
-
Verfiy your email address
-
Navigate to
Domainspage underEmailsection -
Find the trial domain and click
Manage -
Scroll down to
SMTPand clickGenerate new user -
Enter your SMTP name, odennav_icinga_master
-
Note the
SMTP host,Port,UsernameandPasswordgenerated
Configure Email Address of Icinga Master
When an email is generated by a web application, it is given a FROM address of the Linux user running the web server.
Our current email address, icinga@icinga.localdomain, is a non-routable email address without a valid domain name.
SMTP relays will reject invalid or non-routable email addresses. This means we have to configure our Linux system to send emails from a real, routable email address.
Postfix is the MTA (mail transfer agent) we'll use to forward emails to the SMTP Relay host.
Implement Postfix configuration as shown below:
Backup the Postfix configuration file
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bakEdit main postfix configuration file
sudo vi /etc/postfix/main.cfAdd this to end of main.cf file and save changes
sender_canonical_maps = hash:/etc/postfix/sender_canonical
Create the sender_canonical file
sudo touch /etc/postfix/sender_canonicalNext, we tell Postfix to use our email address as the FROM address for any emails.
Add this to end of sender_canonical file and save changes
@icinga.localdomain MS_jefzl3@trial-vywj2lp7znml7oqz.mlsender.net
Convert the sender_canonical file into acceptable format for Postfix
sudo postmap hash:/etc/postfix/sender_canonicalConfirm new formatted file exists
ls -la /etc/postfix/sender_canonical.dbRestart postfix service
sudo systemctl restart postfixConfigure Central Server to Forward Emails to SMTP Relay Host
Next, we configure Postfix to send emails to our sendermail SMTP relay host.
Edit the main.cf postfix configuration file
sudo vi /etc/postfix/main.cfAdd this to end of configuration file and save changes
relayhost = [smtp.mailersend.net]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
header_size_limit = 4096000
Create the sasl_passwd file
sudo vi /etc/postfix/sasl_passwdAdd this to the sasl_passwd file and save changes
smtp.mailersend.net MS_jefzl3@trial-vywj2lp7znml7oqz.mlsender.net:<SMTP PASSWORD>
Convert the sasl_passwd file into acceptable format for Postfix
sudo postmap hash:/etc/postfix/sasl_passwdConfirm new formatted file exists
ls -la /etc/postfix/sasl_passwd.dbRestart postfix service
sudo systemctl restart postfixConfigure Sender Email Address in Icinga
Tell Icinga to send an email when there's an incident.
Confirm the Host object in /etc/icinga2/zones.d/master/message-processor-1.conf is as shown below.
object Host "message-processor-1" {
import "generic-host"
address = "10.33.10.2"
vars.os = "Linux"
vars.http_vhosts["http"] = {
http_uri = "/"
}
vars.notification["mail"] = {
groups = [ "icingaadmins" ]
}
}
You'll have to ensure the custom attribute is added to Host objects in other remote host's configuration file
vars.notification["mail"] = {
groups = [ "icingaadmins" ]
}
This tells Icinga to email anyone in the icingaadmins group.
To add recipient's email address to this email group, edit the User object in /etc/icinga2/conf.d/users.conf file.
Here is the icingaadmin user object
object User "icingaadmin" {
import "generic-user"
display_name = "Icinga 2 Admin"
groups = [ "icingaadmins" ]
email = "<RECIPIENT EMAIL ADDRSS>"
}
To add new users, use same format as User object above, add them to icingaadmins group and specify their email address.
Restart icinga service
sudo systemctl restart icinga2.serviceTo confirm email notifications from Icinga, shutdown any of the remote hosts to simulate an incident.
Observe the email sent from your SMTP relay host.
Enjoy!
