Nagios NRPE Server Ansible Role

Overview

NRPE allows you to remotely execute Nagios plugins on other Linux/Unix machines. This allows you to monitor remote machine metrics (disk usage, CPU load, etc.). Deploying NRPE is easy through your favourite package manager (apt-get install nagios-nrpe-server or yum install nrpe), configuring your Nagios server’s IP, adding your checks on NRPE’s end and letting Nagios know its there.

But if you’re deploying this often (Or not), why not automate it? I created an Ansible role which installs and configures NRPE from scratch on both Debian and CentOS based servers. All you need to do now is configure it in Nagios and you’re rolling.

How it works

It uses Ansible for deployment and configuration (If you aren’t familiar with Ansible, I highly recommend you watch their video introduction here ). The first play installs NRPE and any dependences (NRPE doesn’t come with any plugins on RedHat, wtf?), the second play then configures nrpe.cfg from a Jinja2 template (Ansible’s standard template  language of choice). The third play installs nrpe_ansible.cfg where you can place all your custom checks (Again from a Jinja2 template) and finally the final play ensures its running and configured to start at boot.

The Role

---
# Nagios NRPE Server role by James Loh

# Include variables at the start so they're in scope
- name: Include OS-Specific variables
  include_tasks: "variables.yml"

# Install our needed packages for each specific OS
- include: "packages-{{ ansible_os_family }}.yml"

# Create our config
- name: Create nrpe.cfg from template
  template:
    src: "nrpe.cfg.j2"
    dest: "{{ nagios_nrpe_server_dir }}/nrpe.cfg"
    owner: root
    group: root
    mode: 0644
  notify: restart nagios-nrpe-server

# Create nrpe_ansible.cfg
- name: Create nrpe_ansible.cfg from template
  template:
    src: "nrpe_ansible.cfg.j2"
    dest: "{{ nagios_nrpe_server_dir }}/nrpe_ansible.cfg"
    owner: root
    group: root
    mode: 0644
  notify: restart nagios-nrpe-server

# Sync our plugins
- name: Install global plugins
  copy:
    src: "{{ nagios_nrpe_server_plugins_src_dir }}/global/"
    dest: "{{ nagios_nrpe_server_plugins_dir }}"
    owner: root
    group: root
    mode: 0755
  failed_when: false

# Install per-server plugins
- name: Install per-server plugins
  copy:
    src: "{{ nagios_nrpe_server_plugins_src_dir }}/{{ inventory_hostname }}/"
    dest: "{{ nagios_nrpe_server_plugins_dir }}"
    owner: root
    group: root
    mode: 0755
  failed_when: false

# Ensure NRPE server is running and will start at boot
- name: Ensure NRPE server is running
  service:
    name: "{{ nagios_nrpe_server_service }}"
    state: started
    enabled: yes

As you can see above, its mostly through Jinja2 templates and OS variables. I’ve tested it on CentOS 6, Debian 7 and Ubuntu 14.x. On all systems it worked without a hitch.

Configuration Options

The role allows a few configuration options (see below) although most are either OS Specific and are likely not going to be changed.

  • nagios_nrpe_server_bind_address: 127.0.0.1
  • nagios_nrpe_server_port: 5666
  • nagios_nrpe_server_allowed_hosts: 127.0.0.1

And some OS Specific Variables

RedHat:

  • nagios_nrpe_server_pid: /var/run/nrpe/nrpe.pid
  • nagios_nrpe_server_user: nrpe
  • nagios_nrpe_server_group: nrpe
  • nagios_nrpe_server_repo_redhat: epel
  • nagios_nrpe_server_service: nrpe

Debian:

  • nagios_nrpe_server_pid: /var/run/nagios/nrpe.pid
  • nagios_nrpe_server_user: nagios
  • nagios_nrpe_server_group: nagios
  • nagios_nrpe_server_service: nagios-nrpe-server
  • nagios_nrpe_server_plugins_dir: /usr/lib/nagios/plugins

You can of course override the OS Specific variables I set above through either a hostgroup var or on a per host variable, if your plugins live in a different directory other then /usr/lib/nagios/plugins for example.

Wrap Up

Thats my role, its lightweight and gets the job done. If you’ve got any questions or feel its missing a feature, feel free to ask it below or open an issue on GitHub . Like the role? Don’t forget to rate it on Ansible Galaxy !