410gone.click

©2021 sumomo-99

SNMP Trapを受信してSlackへ通知する方法

更新日: 2021-04-11T07:02:01.807Z

Linux

SNMP Trapを受信してSlackへ通知する方法

SNMP Trapを受信して、Slakへ通知する方法を紹介します。
SNMP Trapの受信にはNet-Snmpを利用しています。
 

目次

  1. snmptrapdのインストール
  2. snmptrapd.confの修正
  3. snmptrap.shの追加
  4. snmptrapdの再起動

 

snmptrapdのインストール

snmpがインストールされていない場合は、snmp受信サーバにインストールをしておきます。

# yum install net-snmp net-snmp-utils

 

snmptrapd.confの修正

SNMP Trapの受信およびSlak通知ができるようにsnmptrapd.condを修正します。

# vi /etc/snmp/snmptrapd.conf

 
以下のような内容を追加します。受信を許可するコミュニティ名は利用環境に合わせて修正をしてください。

authCommunity log,execute,net your_community 
traphandle default /etc/snmp/snmptrap.sh

 

snmptrap.shの追加

SNMP Trap受信時にSlack通知をおこなうシェルスクリプトを追加します。
SlackのWebhookURLやチャネル名は利用環境に合わせて修正をしてください。
スクリプトは、snmptrapd.confのtraphandleで指定したパスに保存してください。今回の例では/etc/snmp/snmptrap.shになります。

#!/bin/bash  
TMP_FILE="/tmp/snmptrapd_$$"  
SLACK_WEBHOOKURL="https://hooks.slack.com/services/XXXXX" 
SLACK_NAME="snmptrap" 
SLACK_ICON=":no_good:"  
STAGE=""  

# EXITシグナルをtrapして一時ファイルの掃除を行う。 
trap 'rm -f "$TMP_FILE"' EXIT  
while read line; do   
# 環境ごとにSlackチャネルを判断
  if [[ -z "$STAGE" ]]; then
    case $line in
    *local*)
       TAGE="local";; 
    *dev1*) 
      STAGE="dev1";; 
    *dev2*) 
      STAGE="dev2";; 
    *dev3*) 
      STAGE="dev3";; 
    *) 
      STAGE="common" 
    esac 
  fi 
  # SNMPメッセージを一時ファイルに書き出し 
  echo $line >> $TMP_FILE 
done  

SLACK_CHANNEL="snmp_"$STAGE  
# SNMPメッセージのダブルクォーテーションをエスケープ 
MESSAGE=`cat $TMP_FILE | sed 's/"/\\\\"/g'` 
# 長いメッセージを切り詰め&ボックスで修飾 
MESSAGE='```'${MESSAGE::2000}'```'  
curl -sS -X POST --data-urlencode "payload={\"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${SLACK_NAME}\", \"icon_emoji\": \"${SLACK_ICON}\", \"text\": \"${MESSAGE}\" }" ${SLACK_WEBHOOKURL} 

 
このスクリプト例では、利用環境(開発環境や本番環境)でSlackチャネルを分けるために、SNMPメッセージのホスト名から環境種別を判断しています。また、SlackのWebhookのメッセージサイズに上限があるため、このスクリプト例では2000バイトに切り詰めています。
 

snmptrapdの再起動

設定の完了後、snmptrapdの再起動を行い、設定を反映します。

# systemctl restart snmptrapd

 
以上、SNMP Trapを受信してSlackへ通知する方法の紹介でした。