본문 바로가기

CentOS/Scenario

[Script]ipmitool Server 점검 Shell script

반응형

매일 아침에 각 장비에 대한 오류 점검을 하나 하나 ipmitool 로 작업을 했으나, 이를 Shell Script 로 작성하면 편리하게 할 수 있다.

 

아래의 스크립트는 IPMI 도구를 사용하여 여러 대의 서버에서 하드웨어 상태 정보를 검색하고 이를 기반으로 서버 상태를 분류하는 스크립트이다.

 

조건은 각 장비에서 점검 후 출력되는 상태메시지에 따라 나눠지게 되어있다.

 

ok -> 장비 구성 이상 없음

ok를 제외한 나머지 -> 장비 구성 이상 있음

session error -> 장비에 접속 불가

 

스크립트에 사용할 인터프리터를 지정합니다. 이 경우는 bash입니다.

#!/bin/bash

 

파일 날짜를 생성하고 시작 메시지를 출력합니다.

file_date=$(date "+%Y-%m-%d")
echo ">>> Start Date: $file_date"
echo ""

< 설명 >

- $(date "+%Y-%m-%d")는 현재 날짜를 YYYY-MM-DD 형식으로 포맷하여 반환합니다.
- file_date 변수에 현재 날짜가 할당됩니다.
- ">>> Start Date: [file_date]" 메시지가 표시됩니다.

 

로그 파일이 존재하는 경우 해당 파일을 삭제합니다.

if [ -f ok_$file_date.log ]; then
    rm ok_$file_date.log
fi

if [ -f nok_$file_date.log ]; then
    rm nok_$file_date.log
fi

if [ -f error_$file_date.log ]; then
    rm error_$file_date.log
fi

< 설명 >

- -f 옵션은 파일이 존재하는지 확인합니다.
- ok_$file_date.log, nok_$file_date.log, error_$file_date.log 파일이 존재하는 경우 해당 파일을 삭제합니다.

 

IP 주소 목록 파일을 읽어들이고 각 주소에 대해 시스템 상태를 확인합니다.

while read line; do
    ...
done < readip_list

< 설명 >

- readip_list 파일에 있는 각 줄에 대해 반복합니다.
- $line 변수에 현재 줄의 값을 할당합니다.

 

현재 IP 주소로 IPMI를 사용하여 시스템 상태를 확인합니다.

ipmitool -I lanplus -H $line -U user -P password sdr elist > ipmi_output.txt 2>&1

< 설명 >

- ipmitool 명령어를 사용하여 IPMI를 통해 시스템 상태를 가져옵니다.
- -I lanplus 옵션은 IPMI 2.0 LAN 인터페이스를 사용합니다.
- -H 옵션은 IP 주소를 지정합니다.
- -U 옵션은 IPMI 사용자 이름을 지정합니다.
- -P 옵션은 IPMI 암호를 지정합니다.
- sdr elist 명령어는 센서 데이터 레코드를 반환합니다.
- > 연산자는 출력을 파일로 리디렉션합니다.
- 2>&1은 stderr를 stdout으로 리디렉션합니다.

 

IPMI 출력에서 오류를 확인하고 오류가 발생한 경우 로그 파일에 IP 주소를 기록합니다.

if grep -q "Unable to establish IPMI vw / RMCP+ session" ipmi_output.txt; then
    echo "$line" >> error_$file_date.log
else
    ...
fi

< 설명 >

- grep -q 명령어는 출력에서 특정 문자열을 찾습니다.
- "Unable to establish IPMI vw / RMCP+ session" 문자열이 발견되면 $line 변수에 있는 IP 주소를 error_$file_date.log 파일에 추가합니다.

 

IPMI 출력에서 센서 데이터 레코드를 파싱하고 각 레코드의 상태를 확인합니다.

cat ipmi_output.txt | cut -d "|" -f 3 | while read result; do
    echo "$result"

    if [ "$result" != "ok" ]; then
        nokcnt=$((nokcnt+1))
    fi
done

< 설명 >

- cat ipmi_output.txt는 IPMI 출력을 출력합니다.
- cut -d "|" -f 3은 "|" 문자를 구분자로 사용하여 출력의 3번째 열만 선택합니다.
- while read result; do는 각 라인을 반복합니다.
- echo "$result"는 현재 라인을 출력합니다.
- $result 변수에는 현재 라인의 3번째 열이 할당됩니다.
- "ok"와 일치하지 않는 경우 nokcnt 변수를 증가시킵니다.

 

NOK(비정상적인) 상태를 가진 센서의 수를 출력합니다.

echo "2 >>> Number of NOK: $nokcnt"
echo ""

< 설명 >

- "2 >>> Number of NOK: [nokcnt]" 메시지가 표시됩니다.

 

모든 센서의 상태가 정상인 경우 "ok" 파일에 IP 주소를 추가하고, 그렇지 않은 경우 "nok" 파일에 IP 주소를 추가합니다.

if [ $nokcnt -eq 0 ]; then
    echo "$line" >> ok_$file_date.log
else
    echo "$line" >> nok_$file_date.log
fi

< 설명 >

- $nokcnt 변수가 0이면 $line 변수에 있는 IP 주소를 ok_$file_date.log 파일에 추가합니다.
- $nokcnt 변수가 0보다 크면 $line 변수에 있는 IP 주소를 nok_$file_date.log 파일에 추가합니다.

 

readip_list 파일에서 각 줄을 읽어와서 반복합니다.

while read line; do
    ...
done < readip_list

< 설명 >

- readip_list 파일에서 각 줄을 읽어옵니다.
- $line 변수에는 현재 줄의 내용이 할당됩니다.
- 반복문 내에서 $line 변수를 사용하여 IPMI를 실행하고 결과를 처리합니다.

 

ipmi_output.txt 파일이 생성됩니다.

ipmitool -I lanplus -H $line -U admin -P password sdr elist > ipmi_output.txt 2>&1

< 설명 >

- ipmi_output.txt 파일에 IPMI 출력이 저장됩니다.
- 2>&1은 오류 메시지를 파일에 저장합니다.

 

ipmi_output.txt 파일을 삭제합니다.

rm ipmi_output.txt

< 설명 >

- ipmi_output.txt 파일을 삭제합니다.

 

다양한 로그 파일을 삭제합니다.

if [ -f ok_$file_date.log ]; then
    rm ok_$file_date.log
fi

if [ -f nok_$file_date.log ]; then
    rm nok_$file_date.log
fi

if [ -f error_$file_date.log ]; then
    rm error_$file_date.log
fi

< 설명 >

- ok_$file_date.log, nok_$file_date.log, error_$file_date.log 파일이 있는 경우 삭제합니다.
- 파일이 없는 경우 아무런 작업을 수행하지 않습니다.

 

스크립트가 시작될 때의 날짜를 출력합니다.

file_date=$(date "+%Y-%m-%d")
echo ">>> Start Date: $file_date"

< 설명 >

- $file_date 변수에 현재 날짜를 할당합니다.
- ">>> Start Date: [file_date]" 메시지가 표시됩니다.

 

공백 줄을 출력합니다.

echo ""

 

센서 정보를 출력합니다.

echo "============"
echo "1 >>> information: $line"
echo ""

< 설명 >

- "============" 메시지가 표시됩니다.
- "1 >>> information: [line]" 메시지가 표시됩니다.
- 빈 줄을 출력합니다.

 

$nokcnt 변수를 초기화합니다.

nokcnt=0

< 설명 >

- $nokcnt 변수에 0을 할당합니다.

 

IPMI 출력에서 NOK 카운트를 계산합니다.

cat ipmi_output.txt | cut -d "|" -f 3 | while read result; do
    echo "$result"

    if [ "$result" != "ok" ]; then
        nokcnt=$((nokcnt+1))
    fi
done

< 설명 >

- ipmi_output.txt 파일에서 '|' 문자를 구분자로 사용하여 3번째 필드를 추출합니다.
- while 루프를 사용하여 각 필드에 대해 반복합니다.
- 각 필드를 $result 변수에 할당합니다.
- $result 변수가 "ok"가 아닌 경우 $nokcnt 변수를 증가시킵니다.

 

NOK 개수를 출력합니다.

echo "2 >>> Number of NOK: $nokcnt"
echo ""

< 설명 >

- "2 >>> Number of NOK: [nokcnt]" 메시지가 표시됩니다.
- 빈 줄을 출력합니다.

 

결과에 따라 로그 파일에 IP 주소를 기록합니다.

if [ $nokcnt -eq 0 ]; then
    echo "$line" >> ok_$file_date.log
else
    echo "$line" >> nok_$file_date.log
fi

< 설명 >

- $nokcnt 변수가 0인 경우 ok_$file_date.log 파일에 IP 주소를 추가합니다.
- $nokcnt 변수가 0이 아닌 경우 nok_$file_date.log 파일에 IP 주소를 추가합니다.

 

IPMI가 실패한 경우 에러 로그 파일에 IP 주소를 추가합니다.

if grep -q "Unable to establish IPMI vw / RMCP+ session" ipmi_output.txt; then
    echo "$line" >> error_$file_date.log
else
    ...
fi

< 설명 >

- ipmi_output.txt 파일에서 "Unable to establish IPMI vw / RMCP+ session" 문자열이 있는지 검사합니다.
- 해당 문자열이 있으면 error_$file_date.log 파일에 IP 주소를 추가합니다.
- 아닌 경우 이후 작업을 수행합니다.

 

ipmi_output.txt 파일을 삭제합니다.

rm ipmi_output.txt

 

구분선을 출력합니다.

echo "========"
echo ""

 

readip_list 파일에서 다음 줄을 읽어옵니다.

done < readip_list

< 설명 >

- while 루프가 종료되고, readip_list 파일에서 다음 줄을 읽어옵니다.

스크립트가 끝났음을 나타내는 메시지를 표시합니다.

echo ">>> Script has been completed!"

 

반응형