Nagios Alert을 Telegram을 통해 받는 방법
Nagios Alert을 Telegram으로 보내는 구성입니다. bot token을 secret env에 분리하고, notify script, command object, contact 연결, 검증과 운영 주의사항을 정리했습니다.
Nagios Alert을 Telegram으로 보내려면 Nagios notification command가 Telegram Bot API의 sendMessage를 호출하면 됩니다. 중요한 점은 bot token을 Nagios object 파일이나 블로그 문서에 직접 적지 않는 것입니다. token은 root/nagios만 읽을 수 있는 별도 env 파일에 두고, Nagios에는 command와 contact만 연결합니다.
Telegram Bot 준비
Telegram에서 BotFather로 bot을 만들고, 알림을 받을 개인 채팅 또는 그룹에 bot을 초대합니다. chat_id는 bot에 메시지를 한 번 보낸 뒤 Telegram Bot API getUpdates로 확인할 수 있습니다. token과 chat_id는 비밀값 또는 민감 설정으로 취급합니다.
secret env 파일
sudo install -d -m 750 -o root -g nagios /etc/nagios/secrets
sudo install -m 640 -o root -g nagios /dev/null /etc/nagios/secrets/telegram.env
sudo editor /etc/nagios/secrets/telegram.env
TELEGRAM_BOT_TOKEN=REPLACE_WITH_BOT_TOKEN
TELEGRAM_CHAT_ID=REPLACE_WITH_CHAT_ID
전송 스크립트
sudo tee /usr/local/bin/nagios-telegram-notify >/dev/null <<'EOF'
#!/usr/bin/env bash
set -Eeuo pipefail
ENV_FILE="/etc/nagios/secrets/telegram.env"
[ -r "${ENV_FILE}" ] || { echo "missing telegram env" >&2; exit 2; }
source "${ENV_FILE}"
subject="${1:-Nagios Alert}"
body="${2:-No message body}"
text="${subject}"$'\n'"${body}"
curl -fsS --max-time 10 \
--data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \
--data-urlencode "text=${text}" \
"https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" >/dev/null
EOF
sudo chmod 750 /usr/local/bin/nagios-telegram-notify
sudo chown root:nagios /usr/local/bin/nagios-telegram-notify
수동 테스트는 Nagios 서버에서 실행하되 token 값을 출력하지 않습니다.
sudo -u nagios /usr/local/bin/nagios-telegram-notify "Nagios test" "Telegram notification path is working."
Nagios command 정의
Nagios Core 문서처럼 알림 방식은 command object로 정의합니다.
define command {
command_name notify-host-by-telegram
command_line /usr/local/bin/nagios-telegram-notify "HOST $NOTIFICATIONTYPE$: $HOSTNAME$ is $HOSTSTATE$" "$HOSTADDRESS$ - $HOSTOUTPUT$"
}
define command {
command_name notify-service-by-telegram
command_line /usr/local/bin/nagios-telegram-notify "SERVICE $NOTIFICATIONTYPE$: $HOSTNAME$/$SERVICEDESC$ is $SERVICESTATE$" "$SERVICEOUTPUT$"
}
contact에 연결
define contact {
contact_name telegram
alias Telegram Notification
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-service-by-telegram
host_notification_commands notify-host-by-telegram
}
검증과 reload
sudo nagios -v /usr/local/nagios/etc/nagios.cfg 2>/dev/null || sudo nagios -v /etc/nagios/nagios.cfg
sudo systemctl reload nagios 2>/dev/null || sudo systemctl restart nagios
운영 주의사항
Telegram 전송 실패가 Nagios 알림 전체를 오래 붙잡지 않도록 curl --max-time을 둡니다. 메시지에는 토큰, 비밀번호, 내부 고객정보를 넣지 않습니다. 장애 알림에는 상태, 호스트, 서비스, 짧은 출력만 담고 상세 로그는 내부 대시보드 링크로 연결하는 방식이 안전합니다.