ESXi 6.7.0 U1 + vMA + apcupsd

この年度末に控えているサーバ群の更新に備えて,ESXi 6.7.0 Update 1 (Build 10764712) と vMA 6.5.0 (Build 4569350) と apcupsd の組み合わせを検証してみました.

1. Install vMA

MyVMware から .zip を Download して Hash を確認してから unzip します.

$ shasum -a 256 vMA-6.5.0.0-4569350.zip 
1bc25ed3f562f1c222838161cc94dec2b3b9ef0f1bbd7c9cac9860326b6a9501  vMA-6.5.0.0-4569350.zip
$ unzip vMA-6.5.0.0-4569350.zip 
Archive:  vMA-6.5.0.0-4569350.zip
  inflating: vMA-6.5.0.0-4569350-system.vmdk  
  inflating: vMA-6.5.0.0-4569350_OVF10.ovf  
  inflating: vMA-6.5.0.0-4569350_OVF10.mf  
  inflating: vMA-6.5.0.0-4569350_OVF10.cert

ESXi Host Client から Deploy します.4 Files を D&D すると .mf と .cert は表示されませんが進めていきます.
( .mf は .ovf と .vmdk の sha1 Hash 値,.cert には証明書が入っています.)
f:id:tcpninja:20190122110004p:plain

Deploy 先の Storage を選択,使用許諾契約書に同意して進めると Deploy Option の画面になります.
ここで Network と Disk の Provisioning 種別を選択して次に進みます.
f:id:tcpninja:20190122110753p:plain

Network 設定画面が表示されるので,環境に合わせて設定します.
f:id:tcpninja:20190122111132p:plain

設定を確認して Deploy します.
f:id:tcpninja:20190122111249p:plain

Deploy が完了すると Console から接続できるので Main Menu から設定を確認してみます.
f:id:tcpninja:20190122111456p:plain

すると,.ovf の Deploy 時に設定した筈の Network 設定がなぜか全て空になっているので,この Menu から再度設定します.
f:id:tcpninja:20190122112002p:plain

Menu の 6) で IP Address を設定します.今回は IPv4 のみを Static で設定しました.
f:id:tcpninja:20190122112242p:plain

同様に 2) で Default G/W, 4) で DNS Server を設定します.3) の Hostname はここで設定できます.
完了したら再度 0) で確認します.
f:id:tcpninja:20190122112653p:plain

1) で Main Menu から抜ける際に vi-admin のパスワード変更を求められるので変更しましょう.
( 初期パスワードは "vmware" です.)
f:id:tcpninja:20190122113050p:plain

パスワード変更が完了すると Login 画面が表示されるので Login してみましょう.
f:id:tcpninja:20190122113232p:plain

これで vMA の準備は完了です!
f:id:tcpninja:20190122113357p:plain

Web UI にも Login してみましょう.
https://サーバ IP or FQDN:5480/ で接続できます.
Web UI では CLI の Menu に無かった Timezone の変更が可能です.
f:id:tcpninja:20190122114234p:plain


2. UPS の接続

ESXi Host と UPS を USB ケーブルで接続後,vMAUPS を追加します.
[ その他のデバイスの追加 ] で [ USB デバイス ] を選択します.
f:id:tcpninja:20190122122057p:plain

[ 新規 USB デバイス ] として Smart-UPS が認識されているので,設定を保存します.
f:id:tcpninja:20190122122227p:plain


3. apcupsd

vMAssh は default 有効なので接続して SuSE のバージョンを確認します.

vi-admin@vma40:~> cat /etc/SuSE-release 
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 3

SuSE 11.x 用の .rpmここから入手できます.
sftp で vMA に upload して Install します.

vi-admin@vma40:/tmp> sudo rpm -ivh /tmp/apcupsd-3.14.8-1.su110.x86_64.rpm 
vi-admin's password:
warning: /tmp/apcupsd-3.14.8-1.su110.x86_64.rpm: Header V4 DSA signature: NOKEY, key ID a81af992
Preparing...                ########################################### [100%]
   1:apcupsd                ########################################### [100%]
insserv: warning: script 'S01vmware-vma' missing LSB tags
insserv: warning: script 'S01vmware-vifpd' missing LSB tags
insserv: warning: script 'vmware-vma' missing LSB tags
insserv: warning: script 'vmware-vifpd' missing LSB tags
insserv: Service network is missed in the runlevels 4 to use service vmware-studio-provagent
apcupsd                   0:off  1:off  2:on   3:on   4:off  5:on   6:off

/etc/apcupsd/aapcupsd.conf を編集します.
rpm で install された apcupsd.conf では usb cable が default 値となっているので,とりあえず UPSNAME だけ変更します.

UPSNAME "UPS名"

apcupsd の自動起動設定を確認し,UPS を認識させるために vMA を再起動します.

vi-admin@vma40:/etc/apcupsd> chkconfig --list | grep apcupsd
apcupsd                   0:off  1:off  2:on   3:on   4:off  5:on   6:off

apcupsd が正しく起動すると apcaccess コマンドで status を確認できます.

vi-admin@vma40:~> sudo /sbin/apcaccess status
APC      : 001,024,0599
DATE     : 2019-01-23 13:12:33 +0900  
HOSTNAME : vma40
VERSION  : 3.14.8 (16 January 2010) suse
UPSNAME  : UPS 名
CABLE    : USB Cable
MODEL    : Smart-UPS 3000 
UPSMODE  : Stand Alone
STARTTIME: 2019-01-23 13:12:32 +0900  
STATUS   : ONLINE 
BCHARGE  : 100.0 Percent
TIMELEFT :  75.0 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME  : 0 Seconds
ALARMDEL : Always
NUMXFERS : 0
TONBATT  : 0 seconds
CUMONBATT: 0 seconds
XOFFBATT : N/A
STATFLAG : 0x07000008 Status Flag
SERIALNO : J11813110464  
FIRMWARE : UPS 09.3 / ID=18
APCMODEL : Smart-UPS 3000 
END APC  : 2019-01-23 13:12:35 +0900

4. ESXi Shutdown Script
仮想マシンを Shutdown し,メンテナンスモードに変更してから Host を Shutdown する Script を作成します.
VMTN の script shutdown vms and host.sh |VMware Communities が参考になります.
なお,ESXi が再起動しても Script が残るように今回は Datastore 中に作成しています.
Script を Host 上から実行して Shutdown の動作を確認しておきます.

[root@hostname:~] /vmfs/volumes/DatastoreNVMe/apcupsd_shutdown.sh

5. 公開鍵認証で ssh させる
vMA から Shutdown Script を実行させるため ESXi 側で鍵ペアを passphrase 無しで作成します.
(Host 再起動すると .ssh ディレクトリごと消えてしまうので注意してください.)
(参考)https://kb.vmware.com/s/article/1002866

[root@hostname:~] /usr/lib/vmware/openssh/bin/ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (//.ssh/id_rsa): 
Created directory '//.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in //.ssh/id_rsa.
Your public key has been saved in //.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:+waMBF4l5WfDBMGFdd8eB/327ghT+rzLeR_SAMPLE_1WZM root@hostname
The key's randomart image is:
+---[RSA 2048]----+
|      .+=*+ . .. |
|    . .ooo . . o.|
|   . o  . =   ..+|
|    . .  o .   o*|
|     . oS     .o*|
|      . o.   ooE+|
|        ..  ++ ++|
|         .. +*.++|
|         ..o  O=.|
+----[SHA256]-----+

公開キーを /etc/ssh/keys-root/authorized_keys として配置します.

[root@hostname:/.ssh] pwd
/.ssh
[root@hostname:/.ssh] ls -al
total 16
drwx------    1 root     root           512 Jan 24 05:41 .
drwxr-xr-x    1 root     root           512 Jan 24 05:41 ..
-rw-------    1 root     root          1704 Jan 24 05:41 id_rsa
-rw-r--r--    1 root     root           395 Jan 24 05:41 id_rsa.pub
[root@hostname:/.ssh] cp -p ./id_rsa.pub /etc/ssh/keys-root/authorized_keys
[root@hostname:/.ssh] ls -al /etc/ssh/keys-root/
total 12
drwxr-xr-x    1 root     root           512 Jan 24 05:51 .
--w-------    1 root     root             0 Nov  8 07:20 .#authorized_keys
drwxr-xr-x    1 root     root           512 Jan 24 04:02 ..
-rw-r--r--    1 root     root           395 Jan 24 05:41 authorized_keys

root の read のみ許可にしておきます.

[root@hostname:/etc/ssh/keys-root] chmod 400 authorized_keys

次に秘密鍵を使って vMA から ESXi に接続してみます.vi-admin の home に .ssh ディレクトリを作成して Host の秘密鍵を esxi_id_rsa として保存しました.

vi-admin@vma40:~> ssh -i /home/vi-admin/.ssh/esxi_id_rsa root@FQDN
The authenticity of host 'FQDN (IP Address)' can't be established.
RSA key fingerprint is be:e2:eb:26:b7:e6:XX:d1:56:b1:8b:79:bc:37:8c:4b [MD5].
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'FQDN,IP Address' (RSA) to the list of known hosts.
The time and date of this login have been sent to the system logs.

WARNING:
   All commands run on the ESXi shell are logged and may be included in
   support bundles. Do not provide passwords directly on the command line.
   Most tools can prompt for secrets or accept them from standard input.

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.
[root@hostname:~] 

うまく接続できているので,Host 上の Script を実行してみます.

vi-admin@vma40:~> ssh -i /home/vi-admin/.ssh/esxi_id_rsa root@FQDN /vmfs/volumes/DatastoreNVMe/apcupsd_shutdown.sh
Shutdown VM 4

Broadcast message from root (Thu Jan 24 15:43:42 2019):

The system is going down for system halt NOW!
Connection to "vMA IP Address" closed by remote host.
Connection to "vMA IP Address"  closed.

最後に vMA 上の /etc/apcupsd/apccontrol を編集します.

105     doshutdown)
106         echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
107         /usr/bin/ssh -i /home/vi-admin/.ssh/esxi_id_rsa root@FQDN /vmfs/volumes/DatastoreNVMe/apcupsd_shutdown.sh
108         ${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"
109     ;;


6. 動作確認

apcupsd.conf で MINUTES の値を実際の TIMELEFT 値より大きく設定し,UPS に給電停止したらすぐ shutdown するようにして動作確認します.
今回ここで嵌りました.
まず,apcupsd の process owner は root なので,/home/vi-admin/.ssh/esxi_id_rsa を 0440 にしたのですが,ESXi 側の ssh 接続で失敗します.
直接コマンド実行すると,Permission が緩いと警告が出ているので,これが阻害要因だったようです.

vi-admin@vma40:/etc/apcupsd> /usr/bin/ssh -i /home/vi-admin/.ssh/esxi_id_rsa root@FQDN /vmfs/volumes/DatastoreNVMe/apcupsd_shutdown.sh
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0440 for '/home/vi-admin/.ssh/esxi_id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /home/vi-admin/.ssh/esxi_id_rsa

そこで,/root/.ssh 配下に esxi_id_rsa を配置して Permission 0400 に変更したのですが,これも失敗.
vi-admin ユーザで ssh 接続テストしていたので, root の known hosts に ESXi Host が追加されていないのが原因でした.
これでやっと成功です!
f:id:tcpninja:20190128182524p:plain

ちなみに,最終的な /etc/apcupsd/apccontrol はこんな感じです.

105     doshutdown)
106         echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
107         /usr/bin/ssh -i /root/.ssh/esxi_id_rsa root@FQDN /vmfs/volumes/DatastoreNVMe/apcupsd_shutdown.sh
108         ${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"
109     ;;