매일 아침에 각 장비에 대한 오류 점검을 하나 하나 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!"
'CentOS > Scenario' 카테고리의 다른 글
[Linux]암호 기억 갯수 변경 방법(SUSE Linux/Photon OS/CentOS) (1) | 2022.07.20 |
---|---|
Scenario>보안 해제 작업(firewall / SELinux 해제) (0) | 2019.09.23 |
Scenario>GUI Mode에서 CLI Mode로 변경(GUI -> CLI) (0) | 2019.09.23 |
Scenario>CLI Mode에서 GUI Mode로 변경(CLI -> GUI) (0) | 2019.09.23 |
Scenario>Backup Script (0) | 2019.09.08 |