본인이 운영하는 VMWare ESXi 서버의 Disk 문제를 사전에 감지하고 Disk 장애로 인한 데이터 유실을 막기 위해 감지 스크립트를 구동 중이다.

 

구성도

0. ESXi 구성 설명

- 나의 ESXi (Ver 5.5) 서버에는 아래와 같은 VM Guest 들이 구동 중이다.

  1. NAS4 Free
  2. Blog Web Server (이 Guest OS는 항상 구동이 된다.)
  3. Windows 2012 R2 Server
  4. Windows 7
  5. RHV
  6. 기타 Linux 서버들

- ESXi의 Storage는 Internel Disk 형태이다.

  1. SSD 512GB * 1EA (OS 영역)
  2. HDD 4TB * 2EA (Data 영역)

- Disk 구성 설명

ESXi의 본체는 PC급으로서 별도의 RAID Controller는 장착되어있지 않다.

대신, Guest VM인 NAS4 Free에서 HDD 2개를 RAID1(4TB+4TB)으로 구성하였다.

RAID1 Disk를 ZFS 볼륨으로 구성하고 iSCSI, CIFS, NFS를 통해 각각의 VM Guest에게 데이터 영역으로 할당을 하여 운영 중이다.

데이터 영역의 볼륨을 RAID1 으로 이중화를 하였지만 Disk Fault 감지를 제때 하지 못 하므로 만약 Disk가 2개 모두 문제가 발생하면 데이터가 유실될 수 있다.

vCenter를 사용하면 Alarm 정책을 통해 감지할 수 있겠지만, 본인은 vCenter를 사용하지 않으므로 항상 켜져있는 Blog Web Server(CentOS Linux)에서 감지하여 메일을 보내주는 방식을 사용하였다.

 

1. ssh 구성

1.1. ESXi sshd 활성화

Blog Server에서 ESXi의 Disk 상태를 체크하기 위해선 root 접속 후 확인이 필요하다.

따라서 ssh 접속을 key를 통해 비번없이 접속할 수 있도록 해야한다.

1.2. ESXi sshd 구동

참고 문서 : ESXi sshd 활성화

1.3. ssh public 키 생성

- 리눅스 VM Guest OS에서

[root@blog ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:G3CoQP7bNcICtrLCoQP7bN/Jj1j4ByCoQP7bNV9+MnY root@blog
The key's randomart image is:
+---[RSA 2048]----+
|  .              |
| o     .         |
|  =   o .        |
| . = o o         |
|. . + o S..      |
|.o.  + +.=oo   . |
|.. .. + ++..+ o  |
|    . .= *B.oo+.E|
|     . oBo+Boo +.|
+----[SHA256]-----+
  • ssh-keygen -t rsa 실행 후 모두 엔터 입력

- id_rsa와 id_rsa.pub 키 파일이 생성된 것이 확인된다.

[root@blog ~]# ls -la /root/.ssh
합계 16
drwx------  2 root root   54 12월 20 08:42 .
dr-xr-x---. 6 root root 4096 12월 20 08:42 ..
-rw-------  1 root root 1679 12월 20 08:38 id_rsa
-rw-r--r--  1 root root  390 12월 20 08:38 id_rsa.pub
-rw-r--r--  1 root root 1220 12월 20 08:42 known_hosts

- id_rsa.pub 키의 내용을 클립 보드에 복사

[root@blog ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKYPVLJ2aEvUj18mgF0BuHbza413SbGjmbnaDgKp4Gg18mgF0BuHbza413Sb+5/vvM6c5OdndVRq0I0x9N+18mgF0BuHbza413Sbh1D7KVFyKbJwe3CrFRfNgZn+UTH/icT0Sh6HxeufuzvSFBGpfM8IFPHOUMkSLjTq8yjRJ8VhY/CzdAQG6Y6p+rLcHNbT/0gLFIh8MX+N6OKQKN4YnPzphgzysFwWc8TJuGPDYIEqJj2kfWC4evh0R6t/kJTtJoYYD7cN6Yf4Rmv+o0YisE2SRRcG5yVhVmUXbvbP2bXsBINvbqlBbqMQNQadQJM8+wzzGlMrA2aGv4A6MMjbV root@blog

- ESXi authorized_keys 에 내용 붙여넣기

~ # vi /etc/ssh/keys-root/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKYPVLJ2aEvUj18mgF0BuHbza413SbGjmbnaDgKp4Gg18mgF0BuHbza413Sb+5/vvM6c5OdndVRq0I0x9N+18mgF0BuHbza413Sbh1D7KVFyKbJwe3CrFRfNgZn+UTH/icT0Sh6HxeufuzvSFBGpfM8IFPHOUMkSLjTq8yjRJ8VhY/CzdAQG6Y6p+rLcHNbT/0gLFIh8MX+N6OKQKN4YnPzphgzysFwWc8TJuGPDYIEqJj2kfWC4evh0R6t/kJTtJoYYD7cN6Yf4Rmv+o0YisE2SRRcG5yVhVmUXbvbP2bXsBINvbqlBbqMQNQadQJM8+wzzGlMrA2aGv4A6MMjbV root@blog

1.4. 로그인 테스트

[root@blog ~]# ssh root@192.168.100.140
The authenticity of host '192.168.100.140 (192.168.100.140)' can't be established.
RSA key fingerprint is SHA256:YDtaBmU3XTHglcvmsuBbVN2s7YDtaBmU/YDtaBmU64k.
RSA key fingerprint is MD5:62:c9:42:e4:eb:97:9a:9d:92:3b:20:0a:ff:7c:47:10.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.140' (RSA) to the list of known hosts.
The time and date of this login have been sent to the system logs.

VMware offers supported, powerful system administration tools.  Please
see www.vmware.com/go/sysadmintools for details.

The ESXi Shell can be disabled by an administrative user. See the
vSphere Security documentation for more information.
~ # who
root            char/pty/t0     00:00   Dec 19 01:03:15  192.168.100.159
  • ESXi 서버의 IP(192.168.100.140)로 ssh root 접속
  • 최초 접속 시 know hosts에 등록을 할 것인지 묻는다. yes 를 눌르면 바로 ESXi Shell 접속이 됨. /root/.ssh/known_hosts 파일에 known host 등록된 후에는 다시 묻지 않는다.
  • ESXi 서버에서 who 명령을 치면 (192.168.100.159 _ blog server)에서 접속한 정보가 확인된다.

참고 문서 : ssh key - 비밀번호 없이 로그인

 

2. ssmtp 설치 및 설정

ssmtp는 메일 발송 프로그램이다.

2.1. ssmtp 설치

[root@blog ~]# yum localinstall -y ssmtp-2.64-14.el7.x86_64.rpm

2.2. 부수 패키지 설치

[root@blog ~]# yum install -y wget gzip

2.3. ssmpt 설정

- 기본 config 파일 백업

[root@blog ~]# mv /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf_original

- ssmtp.conf 설정하기

[root@blog ~]# vi /etc/ssmtp/ssmtp.conf
root=XXXXX@gmail.com
mailhub=smtp.gmail.com:587
hostname=blog
UseTLS=Yes
UseSTARTTLS=Yes
AuthUser=XXXXX@gmail.com
AuthPass=XXXXXXXXXXX
FromLineOverride=YES
TLS_CA_FILE=/etc/pki/tls/certs/ca-bundle.crt
  • 자신의 환경에 맞게 수정한다.
  • hostname이 ssmtp 를 구동하는 서버 hostname과 일치하게 기입할 것. 불일치 시 ssmtp 구동 실패함.
  • 본인은 메일 발송은 gmail, 수신은 개인 메일 서버를 통해 받는 것으로 구성 하였다.
  • 만약 아래와 같은 메시지가 출력되면서 gmail 발송이 안된다면..
  • ssmtp: Authorization failed (535 5.7.8 https://support.google.com/mail/?p=BadCredentials y12sm12246918pfm.158 - gsmtp)
  • 만약 아래와 같은 메시지가 출력되면서 gmail 발송이 안된다면..
  • ssmtp: Authorization failed (535 5.7.8 https://support.google.com/mail/?p=BadCredentials y12sm12246918pfm.158 - gsmtp)
  • 아래 페이지에서 '보안 수준이 낮은 앱 허용: 사용'을 허용할 것.
  • https://myaccount.google.com/lesssecureapps?pli=1  (보안 수준이 낮은 앱의 액세스 )
  • 아래 페이지에서 '새 기기 또는 애플리케이션에서 Google 계정에 다시 로그인' 시도
  • https://accounts.google.com/DisplayUnlockCaptcha  (해당 페이지에 그냥 접근만 하면됨)

 

3. Disk 감지 Script 작성

3.1. Source Directory 생성

[root@blog ~]# mkdir /root/EsxiDiskCheck/

3.2. Script 작성

[root@blog ~]# vi /root/EsxiDiskCheck/EsxiDiskCheck.sh
#!/bin/bash
# 사용자 환경에 맞게 변수를 선언한다.
############################## Variable ##############################
# ESXI ssh 접속 정보
ESXI=root@192.168.100.140
# EsxiDiskCheck.sh 저장 위치
SCRDIR=/root/EsxiDiskCheck
# 로그 디렉토리
LOGDIR=/var/log/EsxiDisk
# KEEPDAYS는 status.log 파일을 얼만큼 보관할지 정함. 182일 지나면 기존 파일은 status.log.gz로 압축 보관. 182로 설정을 하면 text log 파일과 함께 최대 1년분 로그가 남아 있음.
KEEPDAYS="182"
# 메일 발송인 정보
MAILFROM=$(echo 'From: "김마현" <XXXXX@gmail.com>')
# 메일 수신인 정보
MAILTO=$(echo -e "XXXXX@mapoo.net")
# 로그에 작성할 시간값 형식
CURRTIME=`date +%Y-%m-%d"_"%T"_"%Z" UnixTime="%s`
######################################################################

# ESXi에서 수행되는 Disk Check 명령. 3가지를 체크한다.
CHK1=$(ssh $ESXI /usr/lib/vmware/vm-support/bin/smartinfo.sh | grep 'Health Status' | awk '{print $3}' | grep -v OK)
CHK2=$(ssh $ESXI dmesg | grep ScsiDeviceIO | grep 'sense data')
CHK3=$(ssh $ESXI dmesg | grep WARNING | grep 'aborted')
# ESXi의 uptime 명령
UPTIME=$(ssh $ESXI uptime)
# VM Guest (Linux _ blog)의 Wan IP. Wan IP 변동 사항을 알 수 있다.
WANIP=$(wget -T3 -t3 -q http://checkip.dyndns.com -o /dev/null -O /dev/stdout |sed -e 's/.*Current IP Address: //g;s/<br>.*//g' |awk -F"<" '{print " " $1}')

# 로그 디렉토리가 없으면 만든다.
find $LOGDIR >& /dev/null
if [ $? == "1" ]; then
    mkdir -p $LOGDIR
fi

# status.log 로테이션 함수. KEEPDAYS 사용자 변수와 로그에 삽입된 UnixTime을 기준으로 기존 로그를 압축 저장.
LogRotate  () {
find $LOGDIR/status.log >& /dev/null
if [ $? == "0" ]; then
    LOGUNIXTIME=$(head -n 100 $LOGDIR/status.log | grep UnixTime | head -n 1 | awk -F "=" '{print $2}')
    CURUNIXTIME=`date +%s`
    ACCOUNTTIME=`expr $CURUNIXTIME - $LOGUNIXTIME`
    KEEPUNIXTIME=$(($KEEPDAYS * 86400))
    if [ $ACCOUNTTIME -ge $KEEPUNIXTIME ]; then
        mv -f $LOGDIR/status.log $LOGDIR/status.log_old
        gzip -f -1 $LOGDIR/status.log_old
    fi
fi
}

# 메일 보내기 함수. 메일 제목, 본문의 내용을 작성하고 ssmtp를 통해 메일을 보내준다.
# 문제 발견되어 메일을 발송하게 됬을 때 메일 발송 성공 여부도 로그에 기록한다.
MailSend () {
    MAILFROM2=$(echo $MAILFROM)
    MAILTO2=$(echo $MAILTO | sed 's/\, /,/g; s/ //g')
    find $SCRDIR/mailtext.eml >& /dev/null
    if [ $? == "1" ]; then
        touch $SCRDIR/mailtext.eml
        chmod 600 $SCRDIR/mailtext.eml
    fi
    echo "To : $MAILTO2" > $SCRDIR/mailtext.eml
    echo "$MAILFROM2" >> $SCRDIR/mailtext.eml
    echo "Subject: Mapoo Esxi (Disk) Error! - $WANIP" >> $SCRDIR/mailtext.eml
    echo "" >> $SCRDIR/mailtext.eml
    echo "알림시각 : $CURRTIME" >> $SCRDIR/mailtext.eml
    echo "에러내용 : ESXi Disk 문제발생" >> $SCRDIR/mailtext.eml
    echo "" >> $SCRDIR/mailtext.eml
    echo "* Wan IP : $WANIP" >> $SCRDIR/mailtext.eml
    echo "* Uptime : $UPTIME" >> $SCRDIR/mailtext.eml
    echo "" >> $SCRDIR/mailtext.eml
    echo "* mapoo-blog 서버의 $LOGDIR/status.log 로그를 확인하십시오." >> $SCRDIR/mailtext.eml
    echo "* 자세한 내용은 ESXi 서버에 직접 접속 후 확인하십시오." >> $SCRDIR/mailtext.eml
    /usr/sbin/ssmtp -C /etc/ssmtp/ssmtp.conf $MAILTO2 < $SCRDIR/mailtext.eml
    if [ $? == "0" ]; then
        echo "*** 에러로그 메일을 관리자에게 발송하였습니다. ***"
        echo "Mail   : Send OK. (to $MAILTO2)" >> $LOGDIR/status.log
        echo "------------------------------------------------------------------------" >> $LOGDIR/status.log
    else
        echo -e "\033[1;31m*** 에러로그 메일을 관리자에게 발송하는데 실패하였습니다! *** \033[0m"
        echo "Mail   : Send Fail! (to $MAILTO2)" >> $LOGDIR/status.log
        echo "------------------------------------------------------------------------" >> $LOGDIR/status.log
    fi
}

# 로그로테이션 조건을 Unix Time을 통해 체크해서 조건에 맞으면 로테이션한다.
# ESXi의 Disk 상태 체크 3가지 조건을 모두 체크 해서 문제 없으면 로그만 작성하고, 문제 발견되면 로그 작성과 함께 메일을 보낸다.
# 로그에는 date(unix time을 포함), 현재 Esxi Disk 상태, uptime, wan ip를 기록.
if [ "$CHK1" == "" ] && [ "$CHK2" == "" ] && [ "$CHK3" == "" ]; then
    LogRotate ;
    echo "------------------------------------------------------------------------" >> $LOGDIR/status.log
    echo -e "\033[1;32mEsxi Disk Status OK. \033[0m"
    echo "Date   : $CURRTIME" >> $LOGDIR/status.log
    echo "Status : Esxi Disk Status OK." >> $LOGDIR/status.log
    echo "Uptime :$UPTIME" >> $LOGDIR/status.log
    echo "Wan IP :$WANIP" >> $LOGDIR/status.log
    echo "------------------------------------------------------------------------" >> $LOGDIR/status.log
else
    LogRotate ;
    echo "------------------------------------------------------------------------" >> $LOGDIR/status.log
    echo -e "\033[1;31mEsxi Disk Status ABNORMAL! \033[0m"
    echo "Date   : $CURRTIME" >> $LOGDIR/status.log
    echo "Status : Esxi Disk Status ABNORMAL!" >> $LOGDIR/status.log
    echo "Uptime :$UPTIME" >> $LOGDIR/status.log
    echo "Wan IP :$WANIP" >> $LOGDIR/status.log
    MailSend ;    
fi

- 위 스크립트의 주석 라인만 제거하고 싶으면 아래와 같이 수행한다.

[root@blog ~]# sed -i '/^#\ /d' /root/EsxiDiskCheck/EsxiDiskCheck.sh

- 퍼미션 설정 (root 에서 실행될 수 있도록 퍼미션 설정)

[root@blog ~]# chmod 700 /root/EsxiDiskCheck/EsxiDiskCheck.sh

3.3. Disk 감지 구동 방식

  • Linux Guest(Blog Web Server)에서 Cron을 통해  EsxiDiskCheck.sh 주기적으로 수행.
  • Disk 문제가 발견되지 않으면 로그만 기록하지만, 만약 Disk 문제가 발견되면 로그 기록 후 관리자에게 메일 발송.
  • 관리자는 스마트폰을 통해 Push 알람을 받아서 Disk 문제를 감지한다.

3.4. 스크립트 테스트

  • 해당 스크립트가 메일까지 발송을 제대로 하는지 여부는 스크립트 코드 중 CHK1 변수에서 -v (아래 빨간색)를 지우고서 스크립트를 수동으로 실행 시켜본다.
  • CHK1=$(ssh $ESXI /usr/lib/vmware/vm-support/bin/smartinfo.sh | grep 'Health Status' | awk '{print $3}' | grep -v OK)     --> 12번 라인에 위치.
  • 실행 후 /var/log/EsxiDisk/status.log 로그와 수신 메일주소로 메일이 왔는지 확인해 본다.

 

4. 스케쥴 등록

4.1. crontab 설정

- 원하는 시간에 돌 수 있도록 cron job 설정

[root@blog ~]# crontab -e
00 08 * * * /root/EsxiDiskCheck/EsxiDiskCheck.sh
00 20 * * * /root/EsxiDiskCheck/EsxiDiskCheck.sh
  • 오전 08, 오후 08시 하루 2번 수행될 수 있도록 설정된 예이다.

4.2. 로그 확인

- 시간이 흐른 후 로그를 확인해 보면 아래와 같다.

[root@blog ~]# cat /var/log/EsxiDisk/status.log 
------------------------------------------------------------------------
Date   : 2017-12-20_08:00:01_KST UnixTime=1513724401
Status : Esxi Disk Status OK.
Uptime : 23:00:03 up 133 days, 15:12:22, load average: 0.44, 0.41, 0.43
Wan IP : XXX.XXX.XXX.XXX
------------------------------------------------------------------------
------------------------------------------------------------------------
Date   : 2017-12-20_20:00:01_KST UnixTime=1513767601
Status : Esxi Disk Status OK.
Uptime : 11:00:03 up 134 days, 03:12:23, load average: 0.56, 0.53, 0.53
Wan IP : XXX.XXX.XXX.XXX
------------------------------------------------------------------------
------------------------------------------------------------------------
Date   : 2017-12-21_08:00:01_KST UnixTime=1513810801
Status : Esxi Disk Status OK.
Uptime : 23:00:03 up 134 days, 15:12:23, load average: 0.47, 0.48, 0.48
Wan IP : XXX.XXX.XXX.XXX
------------------------------------------------------------------------
.
.
.

4.3. 에러감지

- 만약 에러가 감지 된다면 아래와 같이 로그가 남는다.

------------------------------------------------------------------------
Date   : 2017-12-20_09:15:52_KST UnixTime=1514340052
Status : Esxi Disk Status ABNORMAL!
Uptime : 02:00:54 up 140 days, 18:13:24, load average: 0.37, 0.40, 0.40
Wan IP : XXX.XXX.XXX.XXX
Mail   : Send OK. (to XXXXX@mapoo.net)
------------------------------------------------------------------------

- 또한 아래와 같은 내용으로 메일을 수신 받게된다.

  • 스마트폰에서 도착한 메일을 바로 푸시 알림을 통해 확인하는 방법에 대한 내용은 생략한다.

 

이상이다.

 

ESXi Disk Error Detect and Alert
태그:                             

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다