Voici une solution pour superviser un serveur DELL via Prometheus, AlertManager et Grafana.
Pré-requis
- Un Kubernetes
- Un Prometheus
- Un Alertmanager
- Un Grafana
- Dell OMSA avec le SNMP activé.
Sur votre poste de travail (ou ailleurs), au choix :
- Golang >= 1.9
- Docker pour utiliser l’image Docker fournie par Prometheus. J’ai plutôt utilisé directement Go.
Installer snmp-exporter
snmp-exporter va vous permettre de faire la passerelle entre votre OMSA qui devrait être accessible via SNMP et votre Prometheus. Pour commencer, il faut ajouter les OIDs DELL à snmp-exporter. Voici la procédure :
- Installez sur votre machine snmp-exporter (il vous faudra peut-être la librairie libsnmp-dev) :
git clone https://github.com/prometheus/snmp_exporter.git
cd snmp_exporter/generator
go get -d
go build
- Comme indiqué dans la documentation, il faut récupérer quelques mibs pour fonctionner avec les OIDs déjà déclarés dans le fichier
generator.yml.
cd $HOME/.snmp/mibs
wget ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
tar xvf v2.tar.gz
mv auto/mibs/v2/* .
rm -fr auto
wget ftp://ftp.servertech.com/Pub/SNMP/sentry3/Sentry3.mib
wget http://dl.ubnt-ut.com/snmp/UBNT-UniFi-MIB
wget http://dl.ubnt-ut.com/snmp/UBNT-MIB
wget ftp://ftp.apc.com/apc/public/software/pnetmib/mib/421/powernet421.mib
wget https://global.download.synology.com/download/Document/MIBGuide/Synology_MIB_File.zip
unzip Synology_MIB_File.zip
wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-SW-IP-FORWARDING-MIB.txt
wget https://www.paloaltonetworks.com/content/dam/pan/en_US/assets/zip/technical-documentation/snmp-mib-modules/PAN-MIB-MODULES-7.0.zip
unzip PAN-MIB-MODULES-7.0.zip
wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-ENTITY-SENSOR-MIB.txt
wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-SMI-MIB.txt
wget https://dl.ubnt.com/firmwares/airos-ubnt-mib/ubnt-mib.zip
unzip ubnt-mib.zip
rm *.zip *.tar.gz
wget http://www.circitor.fr/Mibs/Html/D/DELL-RAC-MIB.php
wget http://www.circitor.fr/Mibs/Mib/D/DELL-SHADOW-MIB.mib
- Dans les MIBs DELL, on retrouve souvent du type
DellStringqui est traduit par le générateur de snmp-exporter comme duOctetString. Pour que cette supervision fonctionne, il faut passer par duDisplayString. Deux méthodes pour y arriver :- patcher le générateur. J’avais commencé comme ça, mais avec la récente mise à jour le patch ne fonctionne plus.
- remplacer les
DellStringpar duDisplayString. Ce n’est peut-être pas le mieux, mais pour le besoin, ça ira !
sed -i 's/DellString/DisplayString/g' 10892.mib
sed -i 's/DellString/DisplayString/g' DELL-RAC-MIB.txt
- On rajoute les OIDs DELL qui nous intéressent dans le fichier
generator.yml:
dell:
walk:
- 1.3.6.1.4.1.674.10892 # dell server3
- 1.3.6.1.4.1.674.10893 # dell storage
- On peut maintenant générer le
snmp.yml:
./generator generate
INFO[0000] Loading MIBs from $HOME/.snmp/mibs:/usr/share/snmp/mibs source="net_snmp.go:122"
[...]
INFO[0004] Config written to snmp_exporter/generator/snmp.yml source="main.go:71"
- Récupérez ce
snmp.yml, il faudra le passer en paramètre de snmp-exporter. Plusieurs façons de le faire (stocker ce fichier sur un volume Kubernetes, recréer l’image docker snmp-exporter en y incluant votre version du fichiersnmp.yml…). Je pensais le stocker dans unConfigMap, mais la taille duConfigMapest limitée et le fichiersnmp.ymltrop gros !
J’ai fait le choix de partir sur un InitContainer qui récupère mon fichier snmp.yml sur un serveur web interne pour le stocker dans un volume de type EmptyDir. Mon pod qui partage donc ce volume peut ensuite y accéder. En cas de mise à jour du fichier snmp.yml, un simple delete du pod et votre nouveau fichier sera récupéré.
Deployment k8s
Voilà le deployment que j’ai utilisé pour snmp-exporter :
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: snmp-exporter
name: snmp-exporter
namespace: prometheus
spec:
selector:
matchLabels:
app: snmp-exporter
template:
metadata:
labels:
app: snmp-exporter
spec:
initContainers:
- image: debian:stable-slim
name: get-snmp-conf
command:
- /bin/bash
- -c
- |
apt-get update
apt-get install --no-install-recommends -y wget
cd /etc/snmp_exporter
wget http://votre_serveur/snmp.yml
volumeMounts:
- mountPath: /etc/snmp_exporter
name: snmp-mibs
containers:
- image: prom/snmp-exporter:v0.10.0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /metrics
port: 9116
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
name: snmp-exporter
ports:
- containerPort: 9116
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /metrics
port: 9116
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
resources:
limits:
cpu: 500m
memory: 128Mi
requests:
cpu: 500m
memory: 128Mi
volumeMounts:
- mountPath: /etc/snmp_exporter
name: snmp-mibs
volumes:
- name: snmp-mibs
emptyDir: {}
Service k8s
Pour chaque serveur DELL à superviser, il vous suffira de créer un service Kubernetes comme cet exemple pour que Prometheus scrape les métriques fournies par snmp-exporter.
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/module: dell
prometheus.io/path: /snmp
prometheus.io/scheme: http
prometheus.io/scrape: "true"
prometheus.io/target: 1.2.3.4
name: mon_serveur
spec:
ports:
- port: 9116
protocol: TCP
targetPort: 9116
selector:
app: snmp-exporter
clusterIP: None
Configuration Prometheus
Dans la configuration de votre Prometheus, il faudra rajouter la configuration suivante à la suite des relabel_configs du kubernetes-service-endpoints afin de pouvoir exploiter l’annotation module du service Kubernetes :
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_module]
separator: ;
regex: (.*)
target_label: __param_module
replacement: $1
action: replace
Rechargez la configuration de Prometheus (ou laissez faire votre configmap-reloader).
Vous devriez voir apparaître votre serveur DELL :

TODO : je n’ai pas encore créé mon alerting via AlertManager !
Grafana
Voilà une première version de mon dashboard DELL.


Le dashboard est disponible ici.