From edf76bfaa0b976c4437edebbfcf5fa581f0a7de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Sachse?= <joerg.sachse@slub-dresden.de> Date: Mon, 14 Apr 2025 13:28:03 +0200 Subject: [PATCH] feat: implement fully functional Check_MK monitoring of NetApp NFS shares including history data and dynamic alert thresholds --- ansible.cfg | 3 +- .../local/600/check_netapp_nfs_shares.sh | 37 ++++--------------- tasks/install_checkmk_plugins.yml | 21 +++++------ tasks/main.yml | 2 +- .../check_mk/check_netapp_nfs_shares.cfg.j2 | 18 ++------- 5 files changed, 24 insertions(+), 57 deletions(-) diff --git a/ansible.cfg b/ansible.cfg index 145b36d..b4be8d3 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -33,7 +33,8 @@ roles_path = ./:../:~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles # https://docs.ansible.com/ansible/latest/reference_appendices/config.html#display-skipped-hosts # DEFAULT: display_skipped_hosts = true display_skipped_hosts = false -display_ok_hosts = false +# display_ok_hosts = false +display_ok_hosts = true use_persistent_connections=true diff --git a/files/usr/lib/check_mk_agent/local/600/check_netapp_nfs_shares.sh b/files/usr/lib/check_mk_agent/local/600/check_netapp_nfs_shares.sh index dd3e1fa..a88ed3d 100755 --- a/files/usr/lib/check_mk_agent/local/600/check_netapp_nfs_shares.sh +++ b/files/usr/lib/check_mk_agent/local/600/check_netapp_nfs_shares.sh @@ -37,8 +37,9 @@ #DOC# - https://www.ssh.com/ssh/keygen/ #DOC# - https://docs.netapp.com/ontap-9/index.jsp?topic=%2Fcom.netapp.doc.dot-cm-cmpr-910%2Fvolume__show.html -if [[ ! ( ${BASH_VERSINFO[0]} -eq 4 ) && ( ${BASH_VERSINFO[1]} -ge 2 ) || \ - ! ( ${BASH_VERSINFO[0]} -gt 4 ) ]]; then +BASH_MIN_VERSION="4.2" +# This sorts ascending by version number. If the first version number in the sorted list is equal to our minimal version number, then we can be sure that the installed version of Bash is newer. +if [[ "${BASH_MIN_VERSION}" == "$( echo -e "${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}\n${BASH_MIN_VERSION}" | sort -V | tail -n1 )" ]]; then echo "Only Bash versions 4.2 or above are supported. Aborting execution." exit 1 fi @@ -62,6 +63,7 @@ NETAPP_FIELDS="size,available,used,percent-used" # Include config file not using variable path # based on http://mywiki.wooledge.org/BashFAQ/028 if [[ -e "/etc/check_mk/check_netapp_nfs_shares.cfg" ]]; then + # shellcheck disable=SC1091 source "/etc/check_mk/check_netapp_nfs_shares.cfg" else echo "Configuration at ${CONFIGFILE} expected, but not found. Aborting execution." && exit 1 @@ -74,46 +76,23 @@ function help () { sed -rn 's/^#DOC# ?//;T;p' "$0" } -function get_mgmt_ip_from_network () { - case ${1} in - ${PATTERN_VLAN11}) - echo "${MGMT_VLAN11}" - ;; - ${PATTERN_VLAN13}) - echo "${MGMT_VLAN13}" - ;; - ${PATTERN_VLAN14}) - echo "${MGMT_VLAN14}" - ;; - ${PATTERN_VLAN20}) - echo "${MGMT_VLAN20}" - ;; - *) - echo "unsupported subnet" - ;; - esac -} - # IMPORTANT: Set lock using "flock", NOT "touch"!!! It's atomic and doesn't have to be cleared after the script ran. ( flock -n 9 || exit 1 - NFS_SHARES=$( mount | grep "type nfs" | cut -d " " -f 1 ) + NFS_SHARES=$( findmnt --raw --noheadings --types "nfs4" | cut -d " " -f 2 ) for SHARE in ${NFS_SHARES}; do - VOLUME_IP=$( echo "${SHARE}" | cut -d ":" -f 1 ) - MGMT_IP=$( get_mgmt_ip_from_network "${VOLUME_IP}" ) - [[ "${MGMT_IP}" == "unsupported subnet" ]] && echo "There's no NetApp management IP for this subnet." && next NETAPP_VOLUME=$( echo "${SHARE}" | cut -d ":" -f 2 | cut -d '/' -f 3 ) - RESULT=$( ssh -o StrictHostKeyChecking=no "${SSH_USER}"@"${MGMT_IP}" -C -i "${IDENTITY_FILE}" "${NETAPP_SETTINGS} volume show -vserver ${NETAPP_VSERVER} -volume ${NETAPP_VOLUME} -fields $NETAPP_FIELDS" ) + RESULT=$( ssh -o StrictHostKeyChecking=no "${SSH_USER}"@"${MGMT}" -C -i "${IDENTITY_FILE}" "${NETAPP_SETTINGS} volume show -vserver ${NETAPP_VSERVER} -volume ${NETAPP_VOLUME} -fields $NETAPP_FIELDS" ) [[ -z "${RESULT}" ]] && echo "Didn't get a valid answer from NetApp system for ${NETAPP_VOLUME}." RESULT=$( echo "${RESULT}" | tail -n 2 | tr -d '\r' ) OLDIFS=${IFS} IFS=";" echo "${RESULT}" | while read -r RES_VSERVER RES_VOLUME RES_SIZE RES_AVAILABLE RES_USED RES_PERCENT; do status="P" # Status dynamisch berechnen - itemname="NFS-Share_/vol/${RES_VOLUME}/@${RES_VSERVER}" + itemname="NFS-Share ${RES_VOLUME}/@${RES_VSERVER}" perf_values="Size=${RES_SIZE}|Used=${RES_USED}|Available=${RES_AVAILABLE}|PercentUsed=${RES_PERCENT::-1};80;90" statustext="NFS share fill levels as read from NetApp storage system from vServer ${RES_VSERVER} for volume '/vol/${RES_VOLUME}'. Size: $(( RES_SIZE/1024/1024/1024 )) GB, Used: $(( RES_USED/1024/1024/1024 )) GB, Available: $(( RES_AVAILABLE/1024/1024/1024 )) GB, Percent Used: ${RES_PERCENT}.\\n" - echo "${status} ${itemname} ${perf_values} ${statustext}" + echo "${status} '${itemname}' ${perf_values} ${statustext}" done IFS=${OLDIFS} done diff --git a/tasks/install_checkmk_plugins.yml b/tasks/install_checkmk_plugins.yml index 37deb02..4bd38f9 100644 --- a/tasks/install_checkmk_plugins.yml +++ b/tasks/install_checkmk_plugins.yml @@ -1,7 +1,7 @@ --- -- name: CMK installieren +- name: Install ChecK_MK and dependencies. ansible.builtin.package: - name: "check-mk-agent" + name: ["check-mk-agent", "needrestart"] state: latest - name: Ordner für Check_MK-Plugins anlegen @@ -30,15 +30,14 @@ loop: - name: "nrpe/check_needrestart.sh" - name: "local/600/check_netapp_nfs_shares.sh" - when: ansible_distribution == "Debian" -# - name: install SSH private key for NetApp NFS share monitoring -# copy: -# src: "{{ role_path }}/../ansible_vaults/{{ role_name }}/.ssh/id_ed25519_netapp_report" -# dest: "/usr/lib/check_mk_agent/.ssh/id_ed25519_netapp_report" -# owner: "root" -# group: "root" -# mode: "0400" +- name: Install SSH private key for NetApp NFS share monitoring. + ansible.builtin.copy: + src: "{{ role_path }}/../ansible_vaults/{{ role_name }}/.ssh/id_ed25519_netapp_report" + dest: "/usr/lib/check_mk_agent/.ssh/id_ed25519_netapp_report" + owner: "root" + group: "root" + mode: "0400" - name: Check_MK-Plugins installieren (offizielle Plugins) ansible.builtin.get_url: @@ -101,4 +100,4 @@ dest: "/etc/check_mk/check_netapp_nfs_shares.cfg" owner: "root" group: "root" - mode: "0600" + mode: "0o600" diff --git a/tasks/main.yml b/tasks/main.yml index 52bc0e6..b9ec76b 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -101,7 +101,7 @@ - name: Check_MK-Plugins installieren ansible.builtin.import_tasks: "install_checkmk_plugins.yml" - tags: [monitoring] + tags: [cmk, checkmk, check_mk, check-mk, monitoring] - name: root-Shell einrichten ansible.builtin.import_tasks: "configure_root_shell.yml" diff --git a/templates/etc/check_mk/check_netapp_nfs_shares.cfg.j2 b/templates/etc/check_mk/check_netapp_nfs_shares.cfg.j2 index 018fbda..3d3283a 100644 --- a/templates/etc/check_mk/check_netapp_nfs_shares.cfg.j2 +++ b/templates/etc/check_mk/check_netapp_nfs_shares.cfg.j2 @@ -32,23 +32,11 @@ IDENTITY_PATH="/usr/lib/check_mk_agent/.ssh/" # Mandatory: yes IDENTITY_FILE="${IDENTITY_PATH}id_${IDENTITY_ALGORITHM}_netapp_report" -### Subnet patterns for determining management IP. -### Use subnet string with Bash glob "*" at the end as shown in example. +### NetApp management Hostname. +### IPs are automatically resolved for the correct host subnet by DNS. # Default: (none) # Mandatory: yes -# PATTERN_EXAMPLE="123.34.45.*" -PATTERN_VLAN11="{{ check_netapp_nfs_shares.vault_pattern_vlan11 }}" -PATTERN_VLAN13="{{ check_netapp_nfs_shares.vault_pattern_vlan13 }}" -PATTERN_VLAN14="{{ check_netapp_nfs_shares.vault_pattern_vlan14 }}" -PATTERN_VLAN20="{{ check_netapp_nfs_shares.vault_pattern_vlan20 }}" - -### NetApp management IPs for each VLAN. -# Default: (none) -# Mandatory: yes -MGMT_VLAN11="{{ check_netapp_nfs_shares.vault_mgmt_vlan11 }}" -MGMT_VLAN13="{{ check_netapp_nfs_shares.vault_mgmt_vlan13 }}" -MGMT_VLAN14="{{ check_netapp_nfs_shares.vault_mgmt_vlan14 }}" -MGMT_VLAN20="{{ check_netapp_nfs_shares.vault_mgmt_vlan20 }}" +MGMT="{{ check_netapp_nfs_shares.vault_mgmt }}" #### NetApp output settings # Default: NETAPP_SETTINGS="set -showallfields false;set -showseparator \";\";set -rows 0; set -units raw;" -- GitLab