Nagios 플러그 인 작성 및 디 버 깅 방법 (셸)

91055 단어
선언: 나 기 오 스 는 상당히 괜 찮 은 감시 도구 로 '감시 의 신' 이 라 고 불리 지만 '죽 기 어렵다' 는 직함 도 있다.Nagios 의 모든 매력 을 발휘 하 는 것 은 그의 플러그 인 입 니 다. 다양한 플러그 인 으로 인해 nagios 는 피 와 살 이 있 습 니 다.모니터링 의 내용 이 계속 변화 하고 플러그 인도 계속 변화 합 니 다. 기본 적 인 일부 플러그 인 은 수 요 를 만족 시 키 지 못 할 수도 있 습 니 다. 이 럴 때 스스로 플러그 인 을 써 야 합 니 다.
다음은 제 첫 번 째 Nagios 플러그 인 으로 작성 방법 과 문제 가 있 는 디 버 깅 방법 을 설명 하 는 것 입 니 다.만약 네가 인내심 이 있다 면 전편 을 다 읽 을 수 있다 면, 처음 쓴 사람 에 게 큰 도움 이 될 것 이다.
필요:
일반 디스크 의 건강 상 태 를 감시 하 는 것 (일반 디스크 외 에 RAID, 배열 의 감 시 는 서로 다른 방법 으로 하 는 것 입 니 다. 여 기 는 토론 하지 않 고 가장 간단 한 것 부터 시작 합 니 다) 정기 적 으로 검 사 를 하고 경 고 를 합 니 다. 경보 내용 의 디스크 가 정상 적 인지, 정상 적 이지 않 은 것 이 어떤 상태 인지 알 립 니 다.
작성 과정 분석:
내 가 스 크 립 트 를 쓰 는 전 제 는 모두 수 동 으로 성공 한 다음 에 자동화 까지 이다.
1. 디스크 모니터링 방법 찾기
한 번 에 smartctl 을 찾 는 게 좋 을 것 같 아 요.  centos slackware 보통 기본 값 은 이거 있어 요.
smartctl -H/dev/sda  상태 만 검사
smartctl -i/dev/sda   하드디스크 정보 만 검사
smartctl - a/dev/sda 모든 정보 검출
2. 검 측 정보 획득
# smartctl -H/dev/sda
smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
SMART Health Status: OK
관건 적 인 마지막 줄 은 디스크 의 상황 을 설명 한다.      절취  DISK_HEALTH=`smartctl -H/dev/sda | tail -1 | cut -d: -f2-  `
3. 관건 적 인 판단 을 한다.
제 가 알 기 로 는 smartctl 5.38.  이상 나 온 결과 입 니 다. OK.
스마트 ctl 5.39 는 다음 과 같은 결과 다.
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
키 워드 는 PASSED 입 니 다.
그래서 여러 가지 상황 을 분석 하고 판단 해 야 돼 요.
4. 스 크 립 트 작성 절차
1) nagios 플러그 인 작성 규범 이해
Nagios 플러그 인 은 스 크 립 트 (셸, Perl) C 로 컴 파일 된 실행 가능 한 프로그램 을 사용 할 수 있 지만 다음 두 가 지 를 만족 시 켜 야 합 니 다.
A 、 이미 나 왔 을 때 반환 값 이 있 습 니 다.
B. 표준 출력 장치 (stdOUT) 에 최소한 한 줄 의 파일 을 출력 합 니 다.(그러나 너무 크 면 안 됩 니 다. 기본 값 은 4K 입 니 다. 크게 하려 면 원본 프로그램 을 수정 하 세 요. 방법 검색..)
반환 값 정의:
Plugin Return Code
Service State
DISK State
0
OK
OK 혹은 PASSED
1
WARNING
플러그 인 경고  DISK 신 고 는 OK 나 CRITICAL 로 나 눠 져 있 습 니 다.
2
CRITICAL
DISK 검 사 는 OK 또는 PASSED 가 아 닙 니 다.
3
UNKNOWN
알 수 없 는 상태
2) 플러그 인 작성 SHELL 속성
여기 서 저 는 제 가 가장 잘 아 는 SHELL 을 사용 하여 스 크 립 트 를 작성 합 니 다.
제 속성 법 은 바로 nagios exchange 에 가서 비교적 성숙 하고 간단 한 셸 스 크 립 트 를 내 리 는 것 입 니 다. 그러면 처음부터 다른 사람의 좋 은 방법 을 참고 하여 좋 은 습관 을 기 를 것 입 니 다. 그리고 SHELL 프로 그래 밍 경험 이 조금 만 있 으 면 베테랑 처럼 빨리 쓸 수 있 습 니 다.(하지만 자신 을 기절 시 키 지 않 으 면 된다)
3) 다음은 나의 checkdisk_health.sh
#!/bin/bash
# ========================================================================================
# disk health  plugin for Nagios
#
# Written by    : Ajian
# Release       : 1.2.0
# Creation date : 2009-07-28
# Revision date : 2009-07-30
# Description   : Nagios plugin (script) to check disk health .
#               This script has been designed and written on Linux System.
#
# USAGE         : ./check_disk_health.sh [-d (disk)]
#
# Exemple: ./check_cpu_stats.sh
#          ./check_cpu_stats.sh -d /dev/sda
#
#
# HISTORY :
#     Release   |     Date      |    Authors            |       Description
# --------------+---------------+----------------------+-----------------------------------
#  1.0.0        | 2009-07-28     | Ajian                 | Create the script
#  1.2.0        | 2009-07-30    |  Ajian                | modify the script and run well ,fix a bug.
# -----------------------------------------------------------------------------------------
# NOTICE:
#-----------------------------------------------------------------------------------------
#     You should have the root Permissions ,You can use sudo to realize .
# -----------------------------------------------------------------------------------------                                   

# Nagios return codes
# nagios
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3      

# Paths to commands used in this script.  These may have to be modified to match your system setup.
# smartctl , 。 , 。
SMARTCTL="/usr/sbin/smartctl"
#SMARTCTL=`which smartctl`
#if [ $? -ne 0 ]; then
#        echo " smartctl is found in $SMARTCTL ; Go on ... "
#        echo "smartctl the command cannot find"
#        exit $STATE_UNKNOWN
#fi
# Plugin parameters value if not define
#
CHECK_DISK="/dev/sda"                  

# Plugin variable description
#
PROGNAME=$(basename $0)
RELEASE="Revision 1.2.0"
AUTHOR="(c) 2009 Ajian ([email protected])"

# Functions plugin usage
#
print_release() {
    echo "$RELEASE $AUTHOR"
}                          

print_usage() {
        echo ""
        echo "$PROGNAME $RELEASE - Disk health check script for Nagios"
        echo ""
        echo "Usage: check_disk_health.sh -d /dev/sdb"
        echo ""
        echo "  -d  the disk (/dev/sda) "
        echo "          not the Hard disk partition(sda2 is wrong)"
        echo "  -v  check the version"
        echo "  -h  Show this page"
        echo ""
    echo "Usage: $PROGNAME"
    echo "Usage: $PROGNAME --help"
    echo ""
    exit 0
}                                                                                                          

print_help() {
        print_usage
        echo ""
        echo "This plugin will check disk health  "
        echo ""
        exit 0
}                                                  

# Parse parameters
#
while [ $# -gt 0 ]do
    case "$1" in
        -h | --help)
            print_help
            exit $STATE_OK
            ;;
        -v | --version)
                print_release
                exit $STATE_OK
                ;;
        -d | --disk)
                shift
                CHECK_DISK=$1
                #
                if [ ! -b $CHECK_DISK ];then
                        echo "$CHECK_DISK is no exsit,Please change it "
                        exit $STATE_CRITICAL
                fi
                ;;
        *)  echo "Unknown argument: $1"
            print_usage
            exit $STATE_UNKNOWN
            ;;
        esac
shift
done

# , Linux
case `uname` in
        Linux )
             # , ,
             # , sudo
                DISK_HEALTH=`$SMARTCTL  -H $CHECK_DISK | tail -1 | cut -d: -f2- `
                #DISK_HEALTH="OK"
        #       DISK_INFO=`/usr/bin/sudo $SMARTCTL -i $CHECK_DISK | grep "Device:"`
                if [ "$DISK_HEALTH" = " OK" ]|| [  "$DISK_HEALTH" = " PASSED" ];then
                        echo "OK - $CHECK_DISK status is $DISK_HEALTH "
                        #echo "OK - $CHECK_DISK status is $DISK_HEALTH | $DISK_INFO"
                        exit $STATE_OK
                else
                        echo "CRITICAL - $CHECK_DISK status is $DISK_HEALTH "
                        #echo "CRITICAL - $CHECK_DISK status is $DISK_HEALTH | $DISK_INFO"
                        exit $STATE_CRITICAL
        fi
            ;;

        *)              echo "UNKNOWN: `uname` not yet supported by this plugin. Coming soon !"
                        exit $STATE_UNKNOWN
            ;;
        esac

4) 스 크 립 트 실행
(메모: 처음에 자신 이 쓴 스 크 립 트 는 sudo 가 없 었 습 니 다. 상기 스 크 립 트 는 디 버 깅 을 한 후에 다른 것 을 설정 해 야 합 니 다. 천천히 보 세 요)
스 크 립 트 실행 권한 부여, 수 동 실행
# ./check_disk_health.sh
OK –/dev/sda status is  OK
결과 가 옳 았 다. 사실 이 럴 때 는 너무 일찍 기뻐 했다.나 는 먼저 문 제 를 말 하지 않 고 정상 적 인 일반적인 절 차 를 계속 했다.
5. Nagios 호출 플러그 인 설정
1) 원 격 NRPE 피 감시 서버 에서 nrpe. conf 수정
# vim/usr/local/nagios/etc/nrpe.cfg
명령 추가 [check sda health] =/usr/local/nagios/libexec/checkdisk_health.sh -d/dev/sda
(여기 주의 하 세 요. 여기 가 틀 렸 습 니 다. 보통 정확 합 니 다. 이 스 크 립 트 의 특수성 으로 인 한 것 입 니 다)
2) Nagios 모니터링 서버 에 설정 추가
정의 서비스
define service{
use                             Disk-Health
host_name                       DB-56
servicegroups                   Disk-Health
service_description            check sda disk health
contact_groups                  admins
check_command               check_nrpe!check_sda_health
}
위 에서 정의 한 서비스 와 같다 면 관련 정 의 를 주의해 야 합 니 다.
디스크 헬 스 모드 정의  하 드 디스크 검 사 를 하나의 모델 로 정의 하 는 것 이 비교적 좋 을 것 이다. 하 드 디스크 의 검 측 은 다른 서비스 처럼 정확 한 신속 성 이 필요 하지 않 기 때문에 어차피 너무 많이 검 측 하면 스트레스 를 줄 수 있 고 보통 하루 에 몇 번 검 측 하면 충분 하 다.
DB - 56 호스트 정의 필요
정의 그룹 admins
이상 은 nagios 를 설치 하면 일반적으로 알 수 있 습 니 다.
3) WEB 제어 검 사 를 통 해 결과 보기
결국 실 패 했 습 니 다.  CRITCTL –/dev/sda status is
6. 디 버 깅
Nagios 의 원 격 모니터링 을 보면 실 패 했 고 작업 에 유용 한 정 보 를 얻 지 못 했 습 니 다.
분석 을 통 해 알 수 있 듯 이 nrpe 호출 을 설명 합 니 다.  이 변 수 는 빈 정 보 를 가 져 옵 니 다.
DISK_HEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
즉, 비어 있 는 이 유 는 한 가지 입 니 다. 실행 되 지 않 았 다 면 필드 가 있 을 것 입 니 다. 이 필드 가 일치 하 든 안 하 든.
하지만 수 동 으로 실행 하 는 것 은 문제 가 없다.
smartctl 에 대한 보 기 를 통 해 이 명령 은 루트 만 호출 할 수 있 었 습 니 다.
지금 해결 해 야 할 문 제 는:
루트 가 아 닌 사용자 가 루트 권한 명령 이 필요 한 스 크 립 트 를 원 격 으로 호출 하 는 방법 을 모니터링 합 니 다.
(이 말 을 얕 보지 마라. 모든 단 어 는 정복 해 야 할 곳 이다)
다음은 디 버 깅 절차 입 니 다.
1) 루트 가 아 닌 사용자
NRPE 플러그 인 은 nagios 라 는 사용자 가 실행 하기 때문에 실제 상황 을 얻 으 려 면
A: su nagios   스 크 립 트 재 실행 (이 방법 이 좋 습 니 다)
B: sudo -u nagios ./check_disk_health.sh
결과:
sudo -u nagios ./check_disk_health.sh
CRITICAL –/dev/sda status is
원 격 결과 랑 똑 같 아 요. 정보 가 없어 요.
2) 루트 권한 필요
루트 권한 이 필요 합 니 다. 한 가지 방법 은 sudo 를 사용 하 는 것 입 니 다.
DISKHEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
DISK 로 변경HEALTH=`/usr/bin/sudo $SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
(마지막 으로 이때 sudo 를 추가 하 는 것 이 관건 이 아니 라 스 크 립 트 를 잘 할 때 sudo 를 사용 하 는 것 임 을 발견 했다)
결과: sudo - u nagios./checkdisk_health.sh
Password:
비밀번호 입력 필요 sudo 비밀 번 호 를 입력 하지 않 는 방법
sudo 프로필 수정
실행 visudo
덧붙이다
nagios ALL=(ALL) NOPASSWD:/usr/local/nagios/libexec/check_disk_health.sh
Point Advice: sudo 의 일부 통 제 를 하 는 것 이 좋 습 니 다. 많은 네트워크 방법 은 nagios ALL = NOPASSWD: ALL 입 니 다.
결과:
su nagios
/usr/bin/sudo check_disk_health.sh
OK –/dev/sda status is OK
그럼 nrpe. conf 설정 파일 에 sudo 를 추가 해 야 합 니 다.
command[check_sda_health]=/usr/bin/sudo/usr/local/nagios/libexec/check_disk_health.sh
처음에 그 건 잘못된 주의 입 니 다. 이 건/usr/bin/sudo 를 추가 해 야 합 니 다. 그 러 니까 스 크 립 트 에 루트 권한 을 올 리 는 명령 이 있 으 면 이 걸 로 해 야 합 니 다.
3) 원 격 호출
원 격 호출 방법:./checknrpe -H 192.168.0.56 -c check_sda_health
같은 위 에서 실제 환경 을 모 의 하려 면 해당 실행 사용자 su nagios 로 전환 하여 이상 의 작업 을 수행 하 십시오.
결과:  NRPE: Unable to read output
이 오류 의 원인 은 반드시 알 아야 한다. 이 오 류 를 보고 한 이 유 는 NRPE 가 어떠한 정보 도 얻 지 못 했다 는 것 이 고 스 크 립 트 를 쓰기 전에 말 한 두 번 째 규범 이 라 고 할 수 있다.
질문: 어떤 정보 도 없 이 NRPE 가 실행 하 는 로 그 를 어떻게 가 져 옵 니까?
문제 가 어디 에 있 는 지 확인 하 는 것 이다. 눈 을 크게 찾 아 보면 가끔 재 미 있 는 작은 방법 을 볼 수 있다.
nrpe. conf 설정 파일 을 검사 할 명령 뒤에 추가 합 니 다 >>/tmp/output 2 > & 1 오 류 를 파일 로 내 보 냅 니 다.
command[check_sda_health]=/usr/bin/sudo/usr/local/nagios/libexec/check_disk_health.sh -d/dev/sda >>/tmp/output 2>&1
nrpe 서비스
원 격 호출 결 과 는 당연히 NRPE: Unable to read output
보기/tmp/output
sudo: sorry, you must have a tty to run sudo
잘못 이 있 으 면 간단 하 다. 원래 이것 은 sudo 가 백 엔 드 에서 진행 되 는 것 을 기본적으로 허용 하지 않 습 니 다.
visudo
주석 기본 값 requiretty 는 OK.
결국 WEB 를 통 해 확인 한 것 도 옳 았 다.
(메모: 주석 후 검 측 은 여전히 Unable 이지 만/tmp/output 를 보면 정확 한 결과 가 있 기 때문에 정확 한 결과 가 있 으 면 반드시 제거 해 야 합 니 다 >/tmp/outpt 2 > & 1 정 보 는 파일 에 도 입 됩 니 다. nagios 는 아무런 소식 도 얻 지 못 합 니 다.)
하나의 스 크 립 트 가 실 행 된 후에 대량의 응용 을 생산 환경 으로 검증 하고 문제 가 발생 하면 계속 디 버 깅 합 니 다.
이상 은 모든 분석 디 버 깅 방법 입 니 다.만약 당신 이 마지막 단 계 를 보 았 다 면, 당신 은 매우 인내심 이 있다 는 것 을 설명 합 니 다. 당신 도 반드시 성공 할 것 입 니 다. 좋 고 나 쁨, 옳 고 그 름 에 대해 서 는 얼마든지 말 하 세 요. 이것 은 당신 의 성공 에 영향 을 주지 않 을 것 입 니 다.하하.

좋은 웹페이지 즐겨찾기