Cray XD670 - collect specific sensor(temperature) data from multiple nodes
여러대에서 일부(특정) 센서의 온도 정보만 취합하여 검토하고자 할 때,
a. 정보를 취합하고자 하는 서버들의 BMC 정보를 포함하는 bmc_list.txt 파일을 생성
# cat bmc_list.txt:
e.g.) ---
192.168.1.100 gpu01
192.168.1.105 gpu02.example.com
192.168.1.110 hpc
--------
b. 아래 내용의 온도 취합 스크립트 collect_gpu_temp.sh 파일을 생성
Note. 스크립트의 BMC 계정 정보를 실제 사용 정보로 수정. (동일 계정 사용 권고)
# cat collect_gpu_temp.sh:
--------
#!/bin/bash
# --- 설정 섹션 시작 ---
# 원격 서버의 BMC에 접속할 사용자 이름과 비밀번호 (ipmitool -U/-P 옵션용)
IPMI_USER='BMC_UserName'
IPMI_PASSWORD='BMC_Password'
# IPMI 온도 정보 취합 명령 - 특정 온도 센서만 필터링 (grep 사용, 취합하고자하는 Sensor keyword - cpu and gpu)
IPMI_COMMAND="ipmitool -I lanplus -H {IP_ADDR} -U ${IPMI_USER} -P ${IPMI_PASSWORD} sensor list | grep -i -E '(cpu|gpu)'"
# 서버 BMC 목록 파일 경로
# 각 줄은 "BMC_IP_주소 호스트명" 형식으로 설정
# 예시:
# 192.168.1.100 server-a
# 192.168.1.105 server-b.example.com
# 192.168.1.110 webserver-01
SERVER_LIST_FILE="bmc_list.txt"
# 결과 저장할 디렉토리
# 스크립트가 실행되는 현재 디렉토리에 생성
# OUTPUT_DIR="Cray_temp_$(date +%Y%m%d_%H%M%S)" # 시분초까지 포함한 디렉토리명
OUTPUT_DIR="Cray_temp_$(date +%Y%m%d)" # 일자까지 포함한 디렉토리명
# --- 설정 섹션 끝 ---
echo "--- 원격 BMC 온도 취합 스크립트 (파일 참조) ---"
echo "IPMI 명령어: ${IPMI_COMMAND//\{IP_ADDR\}/<BMC_IP_ADDR>}" # 플레이스홀더 표시
echo "BMC 목록 파일: ${SERVER_LIST_FILE}"
echo "결과 저장 디렉토리: ${OUTPUT_DIR}"
echo "---"
# 결과 저장 디렉토리 생성
mkdir -p "${OUTPUT_DIR}"
if [ $? -ne 0 ]; then
echo "오류: 결과 디렉토리 '${OUTPUT_DIR}'를 생성할 수 없음. 실행 권한 확인 필요."
exit 1
fi
# BMC 목록 파일이 존재하는지 확인
if [ ! -f "${SERVER_LIST_FILE}" ]; then
echo "오류: BMC 목록 파일 '${SERVER_LIST_FILE}'을 찾을 수 없음"
echo "파일이 존재하는지 그리고, 각 줄이 'BMC_IP_주소 호스트명' 형식인지 확인 필요."
exit 1
fi
# BMC 목록 파일에서 각 BMC의 IP 주소와 호스트명을 읽어 처리.
# IFS를 사용하여 공백으로 구분된 필드를 읽고, 주석이나 빈 줄은 무시.
while IFS=' ' read -r BMC_IP_ADDR SERVER_HOSTNAME || [[ -n "$BMC_IP_ADDR" ]]; do
# 주석이거나 빈 줄 건너뛰기
[[ "${BMC_IP_ADDR}" =~ ^#.*$ ]] && continue
[[ -z "${BMC_IP_ADDR}" ]] && continue
echo "## BMC: ${SERVER_HOSTNAME} (${BMC_IP_ADDR}) 에서 온도 정보 수집 중..."
# IPMI_COMMAND 문자열 내의 플레이스홀더 {IP_ADDR}을 실제 BMC IP 주소로 대체
CURRENT_IPMI_COMMAND="${IPMI_COMMAND//\{IP_ADDR\}/$BMC_IP_ADDR}"
# ipmitool 명령 실행
# 여기서는 SSH를 통해 대상 서버에 접속하는 것이 아니라, 스크립트가 실행되는 머신에서
# 직접 해당 BMC IP로 ipmitool 명령어를 전송.
IPMI_OUTPUT=$(eval "${CURRENT_IPMI_COMMAND}" 2>&1) # 에러 메시지도 함께 캡처
if [ $? -eq 0 ]; then
# 파일명 생성 (공백이나 특수문자를 언더스코어로 대체)
# 파일 시스템에서 안전한 이름으로 변환
SAFE_HOSTNAME=$(echo "${SERVER_HOSTNAME}" | sed 's/[^a-zA-Z0-9_-]/_/g')
SAFE_BMC_IP=$(echo "${BMC_IP_ADDR}" | sed 's/[^a-zA-Z0-9._-]/_/g') # IP 주소는 . 허용
OUTPUT_FILENAME="${OUTPUT_DIR}/${SAFE_HOSTNAME}_${SAFE_BMC_IP}_bmc_temp.log"
# 결과를 파일에 저장
echo "${IPMI_OUTPUT}" > "${OUTPUT_FILENAME}"
echo "## BMC: ${SERVER_HOSTNAME} (${BMC_IP_ADDR}) 의 온도 정보를 '${OUTPUT_FILENAME}' 에 저장 완료."
else
echo "## 경고: BMC: ${SERVER_HOSTNAME} (${BMC_IP_ADDR}) 에서 IPMI 명령어 실행 중 오류 발생!"
echo "오류 메시지:"
echo "${IPMI_OUTPUT}" # IPMI 명령어 에러를 출력
fi
echo "" # 구분선
done < "${SERVER_LIST_FILE}" # BMC 목록 파일을 입력으로 사용
echo "--- 모든 BMC에 대한 온도 정보 취합 및 저장 완료 ---"
echo "결과 파일은 '${OUTPUT_DIR}' 디렉토리에 위치함."
--------
c. 두 개 파일을 같은 디렉토리에 위치. (e.g.) /var/tmp/temperature)
d. collect_gpu_temp.sh 파일에 실행 권한 할당
# chmod 755 collect_gpu_temp.sh
e. “Cray_temp_%date%” 디렉토리가 생성되고, 그 아래 각 BMC의 GPU(또는 사용자 지정한 센서)온도가 각 파일에 저장됨.
Note. 필요에 맞춰, 일부 내용은 수정하여 사용.