This is the 18th article in the DevOps series and it discusses the Ansible deployment of Monit, a free and open source utility for managing and monitoring processes, programs, files, directories and file systems on a *nix system.
Monit is a free and open source process supervision tool for *nix systems. It can also be used to monitor files and directories, and perform maintenance or repair tasks. The system status check can be done on the command line and viewed in a browser. It is written entirely in C and released under the AGPL 3.0 licence. In this 18th article in the DevOps series, we will learn to install and set up Monit for the system, as well as the SSH daemon and Nginx Web server monitoring.

Setting it up
A Debian 9 (x86_64) guest virtual machine (VM) using KVM/QEMU will be set up and monitored using Monit.
The host system is a Parabola GNU/Linux-libre x86_64 system and Ansible is installed using the distribution package manager. The version of Ansible used is 2.6.0, as indicated below:
$ ansible --version ansible 2.6.0 config file = /etc/ansible/ansible.cfg configured module search path = [‘/home/guest/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’] ansible python module location = /usr/lib/python3.6/site-packages/ansible executable location = /usr/bin/ansible python version = 3.6.5 (default, May 11 2018, 04:00:52) [GCC 8.1.0]
The Ansible playbook and inventory file are created on the host system as follows:
ansible/inventory/kvm/
/playbooks/configuration/
The inventory/kvm/inventory file contains the following code:
debian ansible_host=192.168.122.197 ansible_connection=ssh ansible_user=debian ansible_password=password
The default Debian 9 installation does not have the sudo package installed. Log in to the VM and install the sudo package. The ‘debian’ user also requires sudo access:
root@debian:~# apt-get install sudo root@debian:~# adduser debian sudo Adding user `debian’ to group `sudo’... Adding user debian to group sudo Done.
You should add an entry in /etc/hosts file for the Debian VM as shown below:
192.168.122.197 debian

You can now test connectivity from Ansible to the Debian 9 VM using the following command:
$ ansible -i inventory/kvm/inventory debian -m ping
debian | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
Installation
The Debian software package repository is first updated and then Monit is installed. The net-tools package is installed to provide the netstat command in the system. The Monit service is then started using systemd. The Ansible playbook for the above tasks is provided below, for reference:
---
- name: Install Monit
hosts: debian
become: yes
become_method: sudo
gather_facts: yes
tags: [install]
tasks:
- name: Update the software package repository
apt:
update_cache: yes
- name: Install monit
package:
name: “{{ item }}”
state: latest
with_items:
- net-tools
- monit
- name: Start monit service
systemd:
name: monit.service
state: started
The above playbook can be invoked using the following command:
$ ansible-playbook -i inventory/kvm/inventory playbooks/configuration/monit.yml --tags install -vv -K

The -vv represents the verbosity in the Ansible output. You can use up to four ‘v’s for a more detailed output. The -K option prompts for the sudo password for the Debian user account.
Web interface
Monit software provides a Web interface that listens on port 2812. The default configuration file for Monit is located at /etc/monit/monitrc. The Web UI port needs to be enabled with basic login credentials. After making changes to the configuration file, the service needs to be restarted. The Ansible playbook to enable the Monit’s Web interface is as follows:
- name: Configure UI
hosts: debian
become: yes
become_method: sudo
gather_facts: true
tags: [ui]
tasks:
- lineinfile:
path: /etc/monit/monitrc
regexp: ‘httpd port 2812’
line: ‘set httpd port 2812 and’
- lineinfile:
path: /etc/monit/monitrc
regexp: ‘# allow admin:monit’
line: ‘ allow admin:monit’
- name: Restart monit service
systemd:
name: monit.service
state: restarted
- wait_for:
port: 2812
The execution of the above playbook to enable the Web interface is shown below:
$ ansible-playbook -i inventory/kvm/inventory playbooks/configuration/monit.yml --tags ui -K SUDO password: PLAY [Install Monit] **************************************** TASK [Gathering Facts] ************************************** ok: [debian] PLAY [Configure UI] ****************************************** TASK [Gathering Facts] ************************************** ok: [debian] TASK [lineinfile] ******************************************** changed: [debian] TASK [lineinfile] ******************************************** changed: [debian] TASK [Restart monit service] ******************************** changed: [debian] TASK [wait_for] ********************************************* ok: [debian] PLAY [Configure ssh monitoring] ****************************** TASK [Gathering Facts] ************************************** ok: [debian] PLAY [Configure ssh monitoring] ****************************** TASK [Gathering Facts] ************************************** ok: [debian] PLAY RECAP ************************************************** debian : ok=8 changed=3 unreachable=0 failed=0
You can use the netstat command to verify that Monit is listening on port 2812 as shown below:
$ netstat -na | grep :2812 tcp 0 0 0.0.0.0:2812 0.0.0.0:* LISTEN tcp6 0 0 :::2812 :::* LISTEN
The syntax validation of the Monit configuration file can be checked using the following command:
$ sudo monit -t Control file syntax OK
The status of the Monit service can be verified as indicated below:
$ sudo monit status Monit 5.20.0 uptime: 2m System ‘debian’ status Running monitoring status Monitored monitoring mode active on reboot start load average [0.00] [0.02] [0.00] cpu 0.4%us 0.3%sy 0.0%wa memory usage 45.5 MB [4.6%] swap usage 0 B [0.0%] uptime 56m boot time Mon, 09 Jul 2018 15:03:06 data collected Mon, 09 Jul 2018 15:57:42
A summary report of the Monit service can also be printed in the console output as follows:
$ sudo monit summary Monit 5.20.0 uptime: 4m ┌─────────────────────────────────┬────────────────────────────┬───────────────┐ │ Service Name │ Status │ Type │ ├─────────────────────────────────┼────────────────────────────┼───────────────┤ │ debian │ Running │ System │ └─────────────────────────────────┴────────────────────────────┴───────────────┘
The status of the Monit service can also be checked from the command line using systemctl, as shown below:
$ sudo systemctl status monit [sudo] password for debian: ● monit.service - LSB: service and resource monitoring daemon Loaded: loaded (/etc/init.d/monit; generated; vendor preset: enabled) Active: active (running) since Mon 2018-07-09 15:55:42 IST; 1min 21s ago Docs: man:systemd-sysv-generator(8) Process: 2293 ExecStop=/etc/init.d/monit stop (code=exited, status=0/SUCCESS) Process: 2298 ExecStart=/etc/init.d/monit start (code=exited, status=0/SUCCESS) Tasks: 2 (limit: 4915) CGroup: /system.slice/monit.service └─2305 /usr/bin/monit -c /etc/monit/monitrc Jul 09 15:55:42 debian systemd[1]: Stopped LSB: service and resource monitoring daemon. Jul 09 15:55:42 debian systemd[1]: Starting LSB: service and resource monitoring daemon... Jul 09 15:55:42 debian monit[2298]: Starting daemon monitor: monit. Jul 09 15:55:42 debian systemd[1]: Started LSB: service and resource monitoring daemon.
You can now open the URL http://192.168.122.197:2812 in a browser on the host system to see the default Monit home page, as shown in Figure 1.
When you click on ‘debian’ under the System column, a more detailed status output is made available, as shown in Figure 2.

SSH
We can now set up Monit to monitor the SSH daemon running inside the VM. A check block for SSH needs to be added to the Monit configuration file and the service needs to be restarted. The Ansible playbook with the required SSH monitoring configuration is given below:
- name: Configure monitoring for nginx
hosts: debian
become: yes
become_method: sudo
gather_facts: true
tags: [ssh]
tasks:
- name: Add ssh monitoring
blockinfile:
path: /etc/monit/monitrc
marker_begin: “ssh BEGIN”
marker_end: “ssh END”
block: |
check process sshd with pidfile /var/run/sshd.pid
group system
group sshd
start program = “/etc/init.d/ssh start”
stop program = “/etc/init.d/ssh stop”
if failed host localhost port 22 with proto ssh then restart
if 5 restarts with 5 cycles then timeout
depend on sshd_bin
depend on sshd_rc
depend on sshd_rsa_key
depend on sshd_dsa_key
check file sshd_bin with path /usr/sbin/sshd
group sshd
include /etc/monit/templates/rootbin
check file sshd_rsa_key with path /etc/ssh/ssh_host_rsa_key
group sshd
include /etc/monit/templates/rootstrict
check file sshd_dsa_key with path /etc/ssh/ssh_host_ecdsa_key
group sshd
include /etc/monit/templates/rootstrict
check file sshd_rc with path /etc/ssh/sshd_config
group sshd
include /etc/monit/templates/rootrc
- name: Restart monit service
systemd:
name: monit.service
state: restarted
The above playbook can be invoked as follows:
$ ansible-playbook -i inventory/kvm/inventory playbooks/configuration/monit.yml --tags ssh -vv -K
The Monit status command in the command line now produces a more detailed output on monitoring the SSH daemon as shown below:
$ sudo monit status
Monit 5.20.0 uptime: 0m
Process ‘sshd’
status Running
monitoring status Monitored
monitoring mode active
on reboot start
pid 381
parent pid 1
uid 0
effective uid 0
gid 0
uptime 1h 6m
threads 1
children 5
cpu 0.0%
cpu total 0.0%
memory 0.6% [6.2 MB]
memory total 3.3% [33.2 MB]
port response time 7.847 ms to localhost:22 type TCP/IP protocol SSH
data collected Mon, 09 Jul 2018 16:09:09
File ‘sshd_bin’
status Accessible
monitoring status Monitored
monitoring mode active
on reboot start
permission 755
uid 0
gid 0
size 772.5 kB
timestamp Thu, 05 Apr 2018 13:18:00
checksum 0c4b6da99164fb9a9291966b1c5b9902 (MD5)
data collected Mon, 09 Jul 2018 16:09:09
File ‘sshd_rsa_key’
status Accessible
monitoring status Monitored
monitoring mode active
on reboot start
permission 600
uid 0
gid 0
size 1.6 kB
timestamp Thu, 05 Apr 2018 13:18:18
checksum de068898089f42cd3ada992e18af4a23 (MD5)
data collected Mon, 09 Jul 2018 16:09:09
File ‘sshd_dsa_key’
status Accessible
monitoring status Monitored
monitoring mode active
on reboot start
permission 600
uid 0
gid 0
size 227 B
timestamp Thu, 05 Apr 2018 13:18:18
checksum abbf249f7ca23dd6f8186072dc0173a3 (MD5)
data collected Mon, 09 Jul 2018 16:09:09
File ‘sshd_rc’
status Accessible
monitoring status Monitored
monitoring mode active
on reboot start
permission 644
uid 0
gid 0
size 3.2 kB
timestamp Thu, 05 Apr 2018 13:18:17
checksum bbad7ed242a834e831c7066901cee49e (MD5)
data collected Mon, 09 Jul 2018 16:09:09
System ‘debian’
status Running
monitoring status Monitored
monitoring mode active
on reboot start
load average [0.00] [0.00] [0.00]
cpu 0.0%us 0.0%sy 0.0%wa
memory usage 47.6 MB [4.8%]
swap usage 0 B [0.0%]
uptime 1h 6m
boot time Mon, 09 Jul 2018 15:03:06
data collected Mon, 09 Jul 2018 16:09:09

Nginx
We can also set up Nginx on the guest VM and monitor it using Monit. The software package repository is first updated and Nginx is then installed. The service is started and we wait for it to listen on port 80. The Nginx monitoring check is then added to the Monit configuration file and the Monit service is restarted. The Ansible playbook for the above tasks is provided below, for reference:
- name: Configure ssh monitoring
hosts: debian
become: yes
become_method: sudo
gather_facts: true
tags: [nginx]
tasks:
- name: Update the software package repository
apt:
update_cache: yes
- name: Install nginx
package:
name: “{{ item }}”
state: latest
with_items:
- nginx
- name: Start nginx
service:
name: nginx
state: started
- wait_for:
port: 80
- name: Add nginx monitoring
blockinfile:
path: /etc/monit/monitrc
marker_begin: “nginx BEGIN”
marker_end: “nginx END”
block: |
check process nginx with pidfile /var/run/nginx.pid
group www
group nginx
start program = “/etc/init.d/nginx start”
stop program = “/etc/init.d/nginx stop”
if 5 restarts with 5 cycles then timeout
depend nginx_bin
depend nginx_rc
check file nginx_bin with path /usr/sbin/nginx
group nginx
include /etc/monit/templates/rootbin
check file nginx_rc with path /etc/init.d/nginx
group nginx
include /etc/monit/templates/rootbin
- name: Restart monit service
systemd:
name: monit.service
state: restarted
The above playbook can be invoked as follows:
$ ansible-playbook -i inventory/kvm/inventory playbooks/configuration/monit.yml --tags nginx -vv -K
The Monit home page now contains the status of the system, the SSH daemon and the Nginx Web server, as shown in Figure 3.
Clicking on the ‘sshd’ or ‘nginx’ link on the Monit home page provides a more detailed status page, as shown in Figures 4 and 5, respectively. You are encouraged to read the Monit manual at https://mmonit.com/monit/documentation/monit.html to learn more about its options and usage.













































































