Ajout des fichiers du projet
This commit is contained in:
parent
c9a3ab5e76
commit
2dc144d356
|
|
@ -1 +1,9 @@
|
|||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [1.0.0] - 2026/02/15
|
||||
### Added
|
||||
- added Zabbix 5.2, 6.0 & 7.0 compatibility
|
||||
137
README.md
137
README.md
|
|
@ -1 +1,138 @@
|
|||
### Zabbix Template Module NFS version 1.0.0
|
||||
|
||||
Tested on Zabbix 4.4 to 7.0
|
||||
|
||||
# Introduction
|
||||
Template for Zabbix to check nfs share availability using external script.
|
||||
It can check:
|
||||
* If NFS server is accepting request
|
||||
* If NFS share are available
|
||||
* The NFS server version
|
||||
|
||||
# Requirement
|
||||
The script use the commands **showmount** & **rpcinfo** so it requires the Linux package **nfs-common**
|
||||
|
||||
To install it you can use the package manager of your distribution
|
||||
|
||||
Exemple
|
||||
```bash
|
||||
apt-get install nfs-common
|
||||
```
|
||||
By the way you may require sudoer rights to run the command.
|
||||
|
||||
On Linux NFS server you may need to install **rpcbind** service to get information from **rpcinfo** command
|
||||
|
||||
# Installation
|
||||
|
||||
## Content
|
||||
The template installation require 3 files:
|
||||
* `frogg_nfs_check.sh` Zabbix external script
|
||||
* `zabbix_template.*` Zabbix template configuration
|
||||
* `userparameter_frogg_nfs_check.conf` Zabbix shortcut for a clean call
|
||||
|
||||
## Introduction
|
||||
|
||||
The script will be launched by Zabbix server, testing if client nfs share is available using a script.
|
||||
That mean Zabbix network must be able to see nfs sharing of the client on the network.
|
||||
|
||||
* All the files are installed on Zabbix server, none is required on the client.
|
||||
* Your network must allow Zabbix server to see nfs share of the client
|
||||
* First check your external script folder, in most of new version you can find it in `/usr/lib/zabbix/externalscripts`
|
||||
You can find the ExternalScripts folder in your `/etc/zabbix/zabbix_server.conf` (default location)
|
||||
```
|
||||
### Option: ExternalScripts
|
||||
# Full path to location of external scripts.
|
||||
# Default depends on compilation options.
|
||||
# To see the default path run command "zabbix_server --help".
|
||||
#
|
||||
# Mandatory: no
|
||||
# Default:
|
||||
# ExternalScripts=${datadir}/zabbix/externalscripts
|
||||
|
||||
ExternalScripts=/usr/lib/zabbix/externalscripts
|
||||
```
|
||||
* For a cleaner script calling this template now use `userparameter` file, You can verify the path stored in your `/etc/zabbix/zabbix_agentd.conf` (default location)
|
||||
```
|
||||
### Option: Include
|
||||
# You may include individual files or all files in a directory in the configuration file.
|
||||
# Installing Zabbix will create include directory in /usr/local/etc, unless modified during the compile time.
|
||||
#
|
||||
# Mandatory: no
|
||||
# Default:
|
||||
# Include=
|
||||
|
||||
Include=/etc/zabbix/zabbix_agentd.d/*.conf
|
||||
```
|
||||
If `/etc/zabbix/zabbix_agentd.conf.d/` doesn't exist you can create it
|
||||
|
||||
## External script
|
||||
|
||||
### Scripts
|
||||
|
||||
Place the `frogg_nfs_check.sh` in `/usr/lib/zabbix/externalscripts`.
|
||||
|
||||
You will need to add execute permission on the script
|
||||
```console
|
||||
chmod +x frogg_nfs_check.sh
|
||||
```
|
||||
|
||||
### User parameters
|
||||
|
||||
Add the `userparameter_frogg_nfs_check.conf` to `/etc/zabbix/zabbix_agentd.conf.d/` (default location)
|
||||
|
||||
### Testing the installation
|
||||
|
||||
You can run the command:
|
||||
- To Test NFS version
|
||||
```
|
||||
./frogg_nfs_check.sh version <ip-of-server>
|
||||
```
|
||||
- To Test NFS share
|
||||
```
|
||||
./frogg_nfs_check.sh share <ip-of-server> "/nfsShare1,/nfsShare2,/nfsShare3"
|
||||
```
|
||||
## Template
|
||||
|
||||
Then you need to import the `zabbix_template.*` template configuration file in the Zabbix web interface in **Template** tab using the import button
|
||||
|
||||
# Host configuration
|
||||
The template use 2 macros :
|
||||
|
||||
| MACRO | Description |
|
||||
|---------------|-------------------------------------------------------------------------------------------------------|
|
||||
| {$NFSVERSION} | the NFS version that should be returned by the server |
|
||||
| {$NFSSHARES} | the list of NFS shares that should be available, to set multiple shares they must be separated by `,` |
|
||||
|
||||
Exemple:
|
||||

|
||||
|
||||
# Template items
|
||||

|
||||
|
||||
# Template triggers
|
||||

|
||||
|
||||
# Debugging
|
||||
|
||||
Going further...This step is working with most of the externals scripts
|
||||
|
||||
If you got troubles getting an external script working, first :
|
||||
1. Check the Zabbix tab **Monitoring > latest data**
|
||||
If you select a host, you should see all items linked to it, check for your item, and you should see the lasted data linked to it.
|
||||
If it appears in gray (disabled) that mean there is something wrong with the external script (rights, path, arguments ...)
|
||||
To find more about it, you can check logs
|
||||
2. By default, the logs are in `/var/log/zabbix/zabbix_server.log` or you can find the log path in Zabbix configuration file `zabbix_server.conf` (by default `/etc/zabbix/zabbix_server.conf`)
|
||||
|
||||
To get the last log lines you can use for example:
|
||||
```bash
|
||||
tail -f /var/log/zabbix/zabbix_server.log
|
||||
```
|
||||
Then look at the script trouble...
|
||||
|
||||
Example:
|
||||

|
||||
In this case Zabbix cannot find the path of the script as you can see *no such file or directory*
|
||||
|
||||
# Contributors
|
||||
[](https://github.com/FroggDev)
|
||||
[](https://github.com/SiKreuz)
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
#!/bin/bash
|
||||
# _ __ _
|
||||
# ((-)).--.((-))
|
||||
# / '' \
|
||||
# ( \______/ )
|
||||
# \ ( ) /
|
||||
# / /~~~~~~~~\ \
|
||||
# /~~\/ / \ \/~~\
|
||||
# ( ( ( ) ) )
|
||||
# \ \ \ \ / / / /
|
||||
# _\ \/ \.______./ \/ /_
|
||||
# ___/ /\__________/\ \___
|
||||
# *****************************
|
||||
# Frogg - admin@frogg.fr
|
||||
# http://github.com/FroggDev/zabbix-nfs
|
||||
# *****************************
|
||||
|
||||
##########
|
||||
# PARAMS #
|
||||
##########
|
||||
NFSACTION=$1
|
||||
NFSSERVER=$2
|
||||
NFSSHARES=$3
|
||||
|
||||
#############
|
||||
# Functions #
|
||||
#############
|
||||
|
||||
# ---
|
||||
# Get the NFS version of a server
|
||||
# @param serverIP
|
||||
# @return NFS version
|
||||
function getNfsVersion()
|
||||
{
|
||||
# Init NFS version to 0 = unavailable
|
||||
VERSION=0
|
||||
|
||||
# Get NFS information using rpcinfo without error messages
|
||||
TESTNFS=$(rpcinfo -t $1 nfs 2> /dev/null)
|
||||
|
||||
# Split all lines in the array TESTNFS
|
||||
IFS=$'\n' read -rd '' -a TESTNFSLINES <<<"$TESTNFS"
|
||||
|
||||
# Loop over all lines of the array TESTNFSLINES
|
||||
for TESTNFSLINE in "${TESTNFSLINES[@]}";
|
||||
do
|
||||
[[ $TESTNFSLINE =~ "version 2 ready and waiting" ]] && VERSION=2
|
||||
[[ $TESTNFSLINE =~ "version 3 ready and waiting" ]] && VERSION=3
|
||||
[[ $TESTNFSLINE =~ "version 4 ready and waiting" ]] && VERSION=4
|
||||
done;
|
||||
|
||||
# Display the NFS version or 0 if not available
|
||||
echo $VERSION
|
||||
}
|
||||
|
||||
# ---
|
||||
# Get the NFS version of a server
|
||||
# @param serverIP
|
||||
# @param nfs share list separated with :
|
||||
# @return nfs share not found
|
||||
function checkNfsShare()
|
||||
{
|
||||
# Init NFS share not available (epmty by default)
|
||||
RESULT=""
|
||||
|
||||
# Get NFS information using showmount without error messages
|
||||
NFSDATA=$(showmount -e $1 2> /dev/null)
|
||||
|
||||
# Store the result as array
|
||||
IFS=$'\n' read -rd '' -a NFSDATAS <<< "$NFSDATA"
|
||||
|
||||
# Get NFS share set as params and store it as an array
|
||||
SHARES=$(echo $2 | tr "," "\n")
|
||||
|
||||
#For each NFS share test if exist in server NFS share list
|
||||
for SHARE in $SHARES
|
||||
do
|
||||
# Check if NFS share does not exist in NFS server shares
|
||||
[[ ! " ${NFSDATAS[@]} " =~ " ${SHARE} " ]] && RESULT="${RESULT}[${SHARE}]"
|
||||
done
|
||||
|
||||
echo $RESULT
|
||||
}
|
||||
|
||||
########
|
||||
# MAIN #
|
||||
########
|
||||
|
||||
# Clean screen
|
||||
#clear
|
||||
|
||||
case ${NFSACTION} in
|
||||
# command check version
|
||||
("version")echo $(getNfsVersion "$NFSSERVER");;
|
||||
# command check nfs share
|
||||
("share")echo $(checkNfsShare "$NFSSERVER" "$NFSSHARES");;
|
||||
# command not set or invalid
|
||||
(*)echo "Error : command [${NFSACTION}] not found"
|
||||
esac
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<zabbix_export>
|
||||
<version>5.2</version>
|
||||
<date>2021-03-14T13:31:06Z</date>
|
||||
<groups>
|
||||
<group>
|
||||
<name>Templates</name>
|
||||
</group>
|
||||
<group>
|
||||
<name>Templates/Modules</name>
|
||||
</group>
|
||||
</groups>
|
||||
<templates>
|
||||
<template>
|
||||
<template>NFS Share</template>
|
||||
<name>Template Module NFS Share</name>
|
||||
<description>This template check NFS version and shares</description>
|
||||
<groups>
|
||||
<group>
|
||||
<name>Templates</name>
|
||||
</group>
|
||||
<group>
|
||||
<name>Templates/Modules</name>
|
||||
</group>
|
||||
</groups>
|
||||
<applications>
|
||||
<application>
|
||||
<name>NFS</name>
|
||||
</application>
|
||||
</applications>
|
||||
<items>
|
||||
<item>
|
||||
<name>NFS share</name>
|
||||
<key>nfsshare.share[{HOST.CONN},{$NFSSHARES}]</key>
|
||||
<delay>2m</delay>
|
||||
<history>7d</history>
|
||||
<trends>0</trends>
|
||||
<value_type>TEXT</value_type>
|
||||
<applications>
|
||||
<application>
|
||||
<name>NFS</name>
|
||||
</application>
|
||||
</applications>
|
||||
<triggers>
|
||||
<trigger>
|
||||
<expression>{strlen()}>0</expression>
|
||||
<name>NFS share {ITEM.VALUE} unavailable on {HOST.NAME}</name>
|
||||
<priority>AVERAGE</priority>
|
||||
</trigger>
|
||||
</triggers>
|
||||
</item>
|
||||
<item>
|
||||
<name>Check NFS version</name>
|
||||
<key>nfsshare.version[{HOST.CONN}]</key>
|
||||
<delay>30m</delay>
|
||||
<history>7d</history>
|
||||
<trends>0</trends>
|
||||
<value_type>FLOAT</value_type>
|
||||
<applications>
|
||||
<application>
|
||||
<name>NFS</name>
|
||||
</application>
|
||||
</applications>
|
||||
<triggers>
|
||||
<trigger>
|
||||
<expression>{last()}=0</expression>
|
||||
<name>NFS service is down on {HOST.NAME}</name>
|
||||
<priority>AVERAGE</priority>
|
||||
</trigger>
|
||||
<trigger>
|
||||
<expression>{last()}<>{$NFSVERSION}</expression>
|
||||
<name>NFS version is {ITEM.VALUE} instead of {$NFSVERSION} on {HOST.NAME}</name>
|
||||
<priority>WARNING</priority>
|
||||
</trigger>
|
||||
</triggers>
|
||||
</item>
|
||||
</items>
|
||||
<macros>
|
||||
<macro>
|
||||
<macro>{$NFSSHARES}</macro>
|
||||
<value>/nfsshare1,/nfsshare2</value>
|
||||
<description>List of shares separated by ,</description>
|
||||
</macro>
|
||||
<macro>
|
||||
<macro>{$NFSVERSION}</macro>
|
||||
<value>4</value>
|
||||
<description>NFS version expected</description>
|
||||
</macro>
|
||||
</macros>
|
||||
</template>
|
||||
</templates>
|
||||
</zabbix_export>
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
{
|
||||
"zabbix_export": {
|
||||
"version": "6.0",
|
||||
"date": "2026-05-15T18:35:42Z",
|
||||
"groups": [
|
||||
{
|
||||
"uuid": "7df96b18c230490a9a0a9e2307226338",
|
||||
"name": "Templates"
|
||||
},
|
||||
{
|
||||
"uuid": "57b7ae836ca64446ba2c296389c009b7",
|
||||
"name": "Templates/Modules"
|
||||
}
|
||||
],
|
||||
"templates": [
|
||||
{
|
||||
"uuid": "f06ff2609709457a8b293b20673a2a38",
|
||||
"template": "NFS Share",
|
||||
"name": "Template Module NFS Share",
|
||||
"description": "This template check NFS version and shares",
|
||||
"groups": [
|
||||
{
|
||||
"name": "Templates"
|
||||
},
|
||||
{
|
||||
"name": "Templates/Modules"
|
||||
}
|
||||
],
|
||||
"items": [
|
||||
{
|
||||
"uuid": "8d5b183b54ae4553b40e9ac5a97057bd",
|
||||
"name": "NFS share",
|
||||
"key": "nfsshare.share[{HOST.CONN},{$NFSSHARES}]",
|
||||
"delay": "2m",
|
||||
"history": "7d",
|
||||
"trends": "0",
|
||||
"value_type": "TEXT",
|
||||
"tags": [
|
||||
{
|
||||
"tag": "Application",
|
||||
"value": "NFS"
|
||||
}
|
||||
],
|
||||
"triggers": [
|
||||
{
|
||||
"uuid": "ff189fd566634a8dba0c50629bc6b308",
|
||||
"expression": "length(last(/NFS Share/nfsshare.share[{HOST.CONN},{$NFSSHARES}]))>0",
|
||||
"name": "NFS share {ITEM.VALUE} unavailable on {HOST.NAME}",
|
||||
"priority": "AVERAGE"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": "131cded651f94bbaabe6dbd674cd91ef",
|
||||
"name": "Check NFS version",
|
||||
"key": "nfsshare.version[{HOST.CONN}]",
|
||||
"delay": "30m",
|
||||
"history": "7d",
|
||||
"trends": "0",
|
||||
"value_type": "FLOAT",
|
||||
"tags": [
|
||||
{
|
||||
"tag": "Application",
|
||||
"value": "NFS"
|
||||
}
|
||||
],
|
||||
"triggers": [
|
||||
{
|
||||
"uuid": "ee493a5919a041c5bc1d10fb7819ce8e",
|
||||
"expression": "last(/NFS Share/nfsshare.version[{HOST.CONN}])=0",
|
||||
"name": "NFS service is down on {HOST.NAME}",
|
||||
"priority": "AVERAGE"
|
||||
},
|
||||
{
|
||||
"uuid": "e883f03d35a54273a6513637f88bbf91",
|
||||
"expression": "last(/NFS Share/nfsshare.version[{HOST.CONN}])<>{$NFSVERSION}",
|
||||
"name": "NFS version is {ITEM.VALUE} instead of {$NFSVERSION} on {HOST.NAME}",
|
||||
"priority": "WARNING"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"macros": [
|
||||
{
|
||||
"macro": "{$NFSSHARES}",
|
||||
"value": "/nfsshare1,/nfsshare2",
|
||||
"description": "List of shares separated by ,"
|
||||
},
|
||||
{
|
||||
"macro": "{$NFSVERSION}",
|
||||
"value": "4",
|
||||
"description": "NFS version expected"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
{
|
||||
"zabbix_export": {
|
||||
"version": "7.0",
|
||||
"template_groups": [
|
||||
{
|
||||
"uuid": "7df96b18c230490a9a0a9e2307226338",
|
||||
"name": "Templates"
|
||||
},
|
||||
{
|
||||
"uuid": "57b7ae836ca64446ba2c296389c009b7",
|
||||
"name": "Templates/Modules"
|
||||
}
|
||||
],
|
||||
"templates": [
|
||||
{
|
||||
"uuid": "f06ff2609709457a8b293b20673a2a38",
|
||||
"template": "NFS Share",
|
||||
"name": "Template Module NFS Share",
|
||||
"description": "This template check NFS version and shares",
|
||||
"groups": [
|
||||
{
|
||||
"name": "Templates"
|
||||
},
|
||||
{
|
||||
"name": "Templates/Modules"
|
||||
}
|
||||
],
|
||||
"items": [
|
||||
{
|
||||
"uuid": "8d5b183b54ae4553b40e9ac5a97057bd",
|
||||
"name": "NFS share",
|
||||
"key": "nfsshare.share[{HOST.CONN},{$NFSSHARES}]",
|
||||
"delay": "2m",
|
||||
"history": "7d",
|
||||
"trends": "0",
|
||||
"value_type": "TEXT",
|
||||
"tags": [
|
||||
{
|
||||
"tag": "Application",
|
||||
"value": "NFS"
|
||||
}
|
||||
],
|
||||
"triggers": [
|
||||
{
|
||||
"uuid": "ff189fd566634a8dba0c50629bc6b308",
|
||||
"expression": "length(last(/NFS Share/nfsshare.share[{HOST.CONN},{$NFSSHARES}]))>0",
|
||||
"name": "NFS share {ITEM.VALUE} unavailable on {HOST.NAME}",
|
||||
"priority": "AVERAGE"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"uuid": "131cded651f94bbaabe6dbd674cd91ef",
|
||||
"name": "Check NFS version",
|
||||
"key": "nfsshare.version[{HOST.CONN}]",
|
||||
"delay": "30m",
|
||||
"history": "7d",
|
||||
"trends": "0",
|
||||
"value_type": "FLOAT",
|
||||
"tags": [
|
||||
{
|
||||
"tag": "Application",
|
||||
"value": "NFS"
|
||||
}
|
||||
],
|
||||
"triggers": [
|
||||
{
|
||||
"uuid": "ee493a5919a041c5bc1d10fb7819ce8e",
|
||||
"expression": "last(/NFS Share/nfsshare.version[{HOST.CONN}])=0",
|
||||
"name": "NFS service is down on {HOST.NAME}",
|
||||
"priority": "AVERAGE"
|
||||
},
|
||||
{
|
||||
"uuid": "e883f03d35a54273a6513637f88bbf91",
|
||||
"expression": "last(/NFS Share/nfsshare.version[{HOST.CONN}])<>{$NFSVERSION}",
|
||||
"name": "NFS version is {ITEM.VALUE} instead of {$NFSVERSION} on {HOST.NAME}",
|
||||
"priority": "WARNING"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"macros": [
|
||||
{
|
||||
"macro": "{$NFSSHARES}",
|
||||
"value": "/nfsshare1,/nfsshare2",
|
||||
"description": "List of shares separated by ,"
|
||||
},
|
||||
{
|
||||
"macro": "{$NFSVERSION}",
|
||||
"value": "4",
|
||||
"description": "NFS version expected"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue