IBM CloudのBare Metal Servers for VPC上に構成されたVMware vSphere環境をZabbixで監視する(SSHチェック編)

# はじめに

このシリーズでは、IBM CloudのBere Metal Servers for VPC上に構成されたVMware vSphereの環境をZabbixで監視する方法について複数の記事に分けて紹介しています。
1. [IBM CloudのBare Metal Servers for VPC上に構成されたVMware vSphere環境をZabbixで監視する(環境構築編)](https://qiita.com/ytada/items/549ca6b5b2dff7c3ef56)
2. [IBM CloudのBare Metal Servers for VPC上に構成されたVMware vSphere環境をZabbixで監視する(テンプレート編)](https://qiita.com/ytada/items/67eef56287f61fe6c0ce)
3. [IBM CloudのBare Metal Servers for VPC上に構成されたVMware vSphere環境をZabbixで監視する(SNMP Trap編)](https://qiita.com/ytada/items/e3e269bb2c59f1ba3bd2)
4. [IBM CloudのBare Metal Servers for VPC上に構成されたVMware vSphere環境をZabbixで監視する(SSHチェック編)](https://qiita.com/ytada/items/ab4deb79cad215d562f7) -> この記事

この記事では、ZabbixでのSSHチェックにおける設定方法や監視項目について書いていきます。
また記事の最後に、これまでのまとめとして監視方法と項目の検討方法に関するの考察を簡単に記載します。


# SSHチェック

Zabbixでは、SSHチェックという監視アイテムが存在します。エージェントレス型の監視方式で、監視対象のホストとsshにより接続を確立し、コマンドをホストに対して定期実行することでそのレスポンスを監視する方式です。任意のコマンドをホスト上で実行することができるため、非常に自由度の高い監視項目を設定することが可能です。

:::note
SSHチェックを実施するにはZabbixでlibssh2モジュールが有効化されている必要があります。libssh2をサーバーにインストールし、Zabbixをコンパイルする際に`--with-ssh2`オプションを付与してください。
:::

今回はESXiのハードウェア状況を確認するため、ESXiに対してSSHチェックを実施します。

## SSHチェックのための事前準備

SSHチェックの設定方法については[こちら](https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/ssh_checks)の公式ドキュメントに記載があります。

特に難しい部分はなく、アイテムを作成するだけなのですが、Zabbix Serverから対象のホストに対してsshで接続できる状態にしておく必要があります。通常のsshと同様にパスワードによる方式か、公開鍵暗号を利用した方式を選択することができますので、要件に合わせて選択しましょう。

#### パスフレーズ認証方式

パスワード方式の場合、特にZabbix側に追加の設定は必要ありません。そのままSSHチェックを実施するアイテムを作成します。

:::note
下記のようなエラーが出た場合、ESXiサーバー側のsshサーバー設定を変更する必要があるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103277/a622cc1f-0fd7-7440-b0f7-991bfcb4585e.png)
暗号化方式などを双方で同じものが利用できるように設定しておきましょう。


ちなみに、Zabbixで利用されているlibssh2ではrsaのみしかサポートされていないようです。
https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/ssh_checks
:::

私は下記のようにESXi側のホスト鍵の暗号化アルゴリズムに`ssh-rsa`を追加しました。(セキュリティ面などを考慮した上でどのように対応するか決定してください。)
```config:/etc/ssh/sshd_config
HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,rsa-sha2-256,rsa-sha2-512,ssh-rsa
```

#### キーファイル認証方式

公開鍵暗号方式の場合は下記のようにZabbixの設定ファイルを変更し、Zabbix Serverを再起動します。
```conf:/usr/local/etc/zabbix_server.conf
### Option: SSHKeyLocation
#	Location of public and private keys for SSH checks and actions.
#
# Mandatory: no
# Default:
SSHKeyLocation=/usr/lib/zabbix/.ssh
```
`ssh-keygen`コマンドで暗号鍵を作成し、上記で設定したディレクトリに暗号鍵を格納します。

また、下記のコマンドで公開鍵をESXiに登録し、公開鍵暗号方式での接続準備は完了です。
```
$ sudo -u zabbix ssh-copy-id root@<ESXi_IP>
```

:::note
暗号鍵方式では様々なエラーによりうまく接続ができない場合があります。下記のような方法で暗号化方式やディレクトリの権限設定を確認してみてください。


- 「zabbix」ユーザーでsshを実行し、デバッグモードで問題箇所を特定する
```
$ sudo -u zabbix ssh -vvv root@<ESXi_IP>
```

- `.ssh`と`authorized_keys`ディレクトリのパーミッションを確認する
sshの秘密鍵はそれを持つだけでサーバーにログインすることのできる、非常にセンシティブなデータです。そのため、パーミッションが甘めに設定されていても接続が拒否されるようになっています。(例えば`authorized_key`に書き込み権限が設定されていると公開鍵を書き込まれてしまう恐れがあります。)そこで、下記のようにパーミッションを設定する必要があります。

Zabbix Server側
```
$ chmod 700 /usr/lib/zabbix/.ssh
```

ESXi側
```
[root@esx-001:~] chmod 600 /etc/ssh/keys-root/authorized_keys
```

- ESXiのsshログファイルを見る
デバッグに非常に役に立ちます。ログデータはESXiの場合`/var/log/auth.log`に格納されています。

:::


## SSHチェックのアイテム作成

SSHチェックを受信するアイテムを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103277/926c0360-2bd7-1e36-8447-bb076040d025.png)


キーは下記のような書式で書く必要があります。Descriptionの項目はホスト単位でユニークである必要があります。また、デフォルトのポートは22となっており、ホストインターフェースのポートは利用されません。
```
ssh.run[<Description>,<Host_IP>,<Port>,<Encoding>]
```

作成すると、定期的にsshでアクセスが行われ、記載したコマンドが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103277/d0362aef-3569-6318-e964-36b1c1f30100.png)


# SSHチェックにより監視できる項目

SSHチェックを利用するとどのような項目を監視することができるか確認します。基本的にはOS(ESXi)上で実行できるコマンドは全て実行することができるため、様々なコンポーネントのステータスを確認することができます。

## ESXCLI

ESXiには、ESXiの設定や管理、情報収集を行うためのCLIが用意されています。ESXCLIという名称で、ハードウェアやネットワーク、ストレージなどに関するコマンドが提供されています。

https://developer.vmware.com/docs/11743/esxi-7-0-esxcli-command-reference/


例えば下記のような項目を確認することができます。

```shell:物理NICを確認する
[root@esx-001:~] esxcli network nic list
Name    PCI Device    Driver    Admin Status  Link Status   Speed  Duplex  MAC Address         MTU  Description
------  ------------  --------  ------------  -----------  ------  ------  -----------------  ----  -----------
vmnic0  0000:19:00.0  ionic_en  Up            Up           100000  Full    02:00:04:2c:82:0e  1500  Pensando Systems DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card, Ethernet Controller
```

```shell:ストレージデバイスを確認する
[root@esx-001:~] esxcli storage core adapter list
HBA Name  Driver    Link State  UID           Capabilities  Description
--------  --------  ----------  ------------  ------------  -----------
vmhba0    vmw_ahci  link-n/a    sata.vmhba0                 (0000:6d:00.0) Marvell Technology Group Ltd. 88SE9230 PCIe SATA 6Gb/s Controller
vmhba1    iavmd     link-n/a    pscsi.vmhba1                (0000:98:05.5) Intel Corporation Intel Volume Management Device
vmhba2    iavmd     link-n/a    pscsi.vmhba2                (0000:ac:05.5) Intel Corporation Intel Volume Management Device
vmhba3    iavmd     link-n/a    pscsi.vmhba3                (0000:d8:05.5) Intel Corporation Intel Volume Management Device
vmhba4    iavmd     link-n/a    pscsi.vmhba4                (0000:ec:05.5) Intel Corporation Intel Volume Management Device
```

```shell:ESXiのARPテーブルを確認する
[root@esx-001:~] esxcli network ip neighbor list
Neighbor   Mac Address        Vmknic   Expiry  State  Type
---------  -----------------  ------  -------  -----  ----
10.18.0.1  02:00:00:2c:82:0e  vmk0    709 sec         Dynamic
10.18.0.4  02:00:03:2c:82:0e  vmk0    521 sec         Dynamic
10.18.0.6  02:00:05:2c:82:0e  vmk0    892 sec         Dynamic
```

vSphereには他にも`vsish`、`vim-cmd`、`vmkfstools`など管理用の様々なコマンドがあるので、必要なデータを確認するために利用することができます。コマンドの利用は構成を意図せず変更してしまう場合がありますので十分にご留意ください。

## RAID Controllerの管理コマンド

RAIDコントローラーには、ログインしたOS上でコマンドラインからRAID構成を管理することのできるツールがあり、RAIDの構成状態やディスクの状態を確認することもできます。esxcliで得ることのできる情報では監視が難しい場合、管理ツールをダウンロードし、利用するのが良いと思います。

BMS for VPCの場合、上記のようにMarvellの88SE9230というRAID Controllerを利用しているようです。Marvellの管理ツールとしては下記のようなものがあるようです。時間がある時に別途記事にしたいと思います。
[Marvell ESXCLI Plug-in for VMware vSphere](https://www.marvell.com/content/dam/marvell/en/public-collateral/ethernet-adaptersandcontrollers/marvell-ethernet-adapters-fastlinq-series-esxcli-vmware-user-guide.pdf)

## その他のコマンド

### cim-diagnostic.sh

ハードウェアの診断情報を呼び出すコマンドです。かなりの情報量のデータが出てきますが、PCIデバイスやメモリーなどの情報は抽出することができそうです。

```
[root@esx-001:~] cim-diagnostic.sh
[Sun Jul 31 04:04:34 UTC 2022] CIM Diagnostic dump for root/interop
[Sun Jul 31 04:04:34 UTC 2022] Dumping instances of CIM_Namespace

・・・
VMware_PCIDevice.SystemCreationClassName="OMC_UnitaryComputerSystem",SystemName="45e02c00-a0b7-11ea-8000-000000000000",CreationClassName="VMware_PCIDevice",DeviceID="PCI 0:109:0:0"
                      DeviceID = PCI 0:109:0:0
             CreationClassName = VMware_PCIDevice
                    SystemName = 45e02c00-a0b7-11ea-8000-000000000000
       SystemCreationClassName = OMC_UnitaryComputerSystem
                  PhysicalSlot = (NULL)
                ParentDeviceID = PCI 0:108:1:0
                 SegmentNumber = 0
                  SubClassCode = 6
                    RevisionID = 17
                      VendorID = 6987
                   PCIDeviceID = 37424
                FunctionNumber = 0
                  DeviceNumber = 0
                     BusNumber = 109
             SubsystemVendorID = 5593
                   SubsystemID = 6944
                     ClassCode = 1
                  Capabilities = { 1, 5, 16, 18,  }
                RequestedState = 0
                  EnabledState = 0
                 PrimaryStatus = 0
                   HealthState = 0
                   ElementName = Marvell Technology Group Ltd. 88SE9230 PCIe SATA 6Gb/s Controller #0
               SelfTestEnabled = (NULL)
       ExpansionROMBaseAddress = (NULL)
                  InterruptPin = (NULL)
                  LatencyTimer = (NULL)
                 CacheLineSize = (NULL)
            DeviceSelectTiming = (NULL)
        CapabilityDescriptions = (NULL)
               CommandRegister = (NULL)
                MaxQuiesceTime = (NULL)
        AdditionalAvailability = (NULL)
       IdentifyingDescriptions = (NULL)
             TotalPowerOnHours = (NULL)
                  PowerOnHours = (NULL)
          OtherIdentifyingInfo = (NULL)
                  ErrorCleared = (NULL)
              ErrorDescription = (NULL)
                 LastErrorCode = (NULL)
                    StatusInfo = (NULL)
                  Availability = (NULL)
   PowerManagementCapabilities = (NULL)
      PowerManagementSupported = (NULL)
                   Description = (NULL)
                       Caption = (NULL)
                    InstanceID = (NULL)
                   InstallDate = (NULL)
                          Name = (NULL)
             OperationalStatus = (NULL)
            StatusDescriptions = (NULL)
                        Status = (NULL)
           CommunicationStatus = (NULL)
                DetailedStatus = (NULL)
               OperatingStatus = (NULL)
             OtherEnabledState = (NULL)
                EnabledDefault = 2
         TimeOfLastStateChange = (NULL)
      AvailableRequestedStates = (NULL)
          TransitioningToState = 12
               TimeOfLastReset = (NULL)
             ProtocolSupported = (NULL)
           MaxNumberControlled = (NULL)
           ProtocolDescription = (NULL)
                   BaseAddress = (NULL)
                  MinGrantTime = (NULL)
                    MaxLatency = (NULL)

・・・
OMC_PhysicalMemory.CreationClassName="OMC_PhysicalMemory",Tag="32.0"
                           Tag = 32.0
             CreationClassName = OMC_PhysicalMemory
                MaxMemorySpeed = 2933
                  IsSpeedInMhz = true
            InterleavePosition = 255
                 PositionInRow = 255
                    TotalWidth = 72
                         Speed = (NULL)
                  SerialNumber = 379D639E
             RemovalConditions = (NULL)
                    PartNumber = M393A4K40DB2-CVF
             OperationalStatus = { 0,  }
                    MemoryType = 26
                  Manufacturer = Samsung
                   HealthState = (NULL)
                    FormFactor = 8
                   ElementName = P1-DIMMA1
                   Description = P1-DIMMA1
                     DataWidth = 64
                       Caption = P1-DIMMA1
                      Capacity = 34359738368
                    CanBeFRUed = (NULL)
                  UserTracking = (NULL)
           VendorEquipmentType = (NULL)
               ManufactureDate = (NULL)
                     PoweredOn = (NULL)
          OtherIdentifyingInfo = (NULL)
                       Version = (NULL)
                           SKU = (NULL)
                         Model = (NULL)
                    InstanceID = (NULL)
                   InstallDate = (NULL)
                          Name = (NULL)
            StatusDescriptions = (NULL)
                        Status = (NULL)
           CommunicationStatus = (NULL)
                DetailedStatus = (NULL)
               OperatingStatus = (NULL)
                 PrimaryStatus = (NULL)
                     Removable = (NULL)
                   Replaceable = (NULL)
                  HotSwappable = (NULL)
                     BankLabel = P0_Node0_Channel0_Dimm0
    ConfiguredMemoryClockSpeed = (NULL)
・・・
```

### smbiosDump

こちらもハードウェア情報を収集するコマンドです。Linuxのdmidecodeコマンドに相当します。空きスロットも含め、各スロットにインストールされているRAMの情報を確認することができます。

```
[root@esx-001:~] smbiosDump
Dumping live SMBIOS data!

・・・

Physical Memory Array (Type 16): #15
    Use: 0x03 (System memory)
    Location: 0x03 (Motherboard)
    Slots: 48
    Max. Size: 2048 GB
    ECC: 0x05 (Single-bit)
  Memory Device (Type 17): #16
    Location: "P1-DIMMA1"
    Bank: "P0_Node0_Channel0_Dimm0"
    Manufacturer: "Samsung"
    Serial: "379D639E"
    Asset Tag: "P1-DIMMA1_AssetTag (Date:20/23)"
    Part Number: "M393A4K40DB2-CVF"
    Memory Array: #15
    Form Factor: 0x09 (DIMM)
    Type: 0x1a (DDR4)
    Type Detail: 0x0080 (Synchronous)
    Data Width: 64 bits (+8 ECC bits)
    Size: 32 GB
    Max. Speed: 2933 MT/s
    Rank: 2
    Configured Speed: 2934 MT/s
    Min. Voltage: 1200 mV
    Max. Voltage: 1200 mV
    Configured Voltage: 1200 mV
    Technology: 0x03 (DRAM)
    Mode Capability: 0x0008 (Volatile)
    Firmware Version: "0000"
    Module Manufacturer ID: 0xce80
    Volatile Size: 34359738368 bytes
  Memory Device (Type 17): #17
    Location: "P1-DIMMA2"
    Bank: "NO DIMM"
    Manufacturer: "NO DIMM"
    Serial: "NO DIMM"
    Asset Tag: "NO DIMM"
    Part Number: "NO DIMM"
    Memory Array: #15
    Form Factor: 0x02 (Unknown)
    Type: 0x02 (Unknown)
    Type Detail: 0x0004 (Unknown)
    Data Width: 0 bits
    Size: No Memory Installed
    Min. Voltage: 1200 mV
    Max. Voltage: 1200 mV
    Configured Voltage: 1200 mV
    Technology: 0x02 (Unknown)
    Mode Capability: 0x0008 (Volatile)
    Firmware Version: "NO DIMM"
・・・
```


# まとめと考察

複数の記事に渡って、IBM CloudのBMS for VPC上に構成されたVMware vSphere環境をZabbixでどのように監視することができるかを確認してきました。仮想環境自体の監視やネットワークポートの監視は特に問題なくできる一方、冒頭の記事でも記載した通り、現状ではBMS for VPCではIPMIを利用することができないため、ハードウェアのステータスを監視するのに工夫が必要であり、ストレージやメモリーの監視は難しいようです。

下記にこのシリーズ全体を通して確認したZabbixによる監視方法についてまとめました。メモ程度ですが、参考になれば幸いです。

- テンプレートの適用による監視
    - エージェントレスでvSphere APIから取れる情報を取得している
    - 主にリソースの監視、ESXiのステータスの監視、死活監視など

- SNMP Trap監視
    - ESXiからのTrap
        - ESXiホスト上のステータスなど
    - vCenterからのTrap
        - vSphere環境全体の障害(vCenterのアラームがTrapされる)

- SSH チェック
    - HWなどの情報が個別に欲しい場合、この方法で確認できる可能性がある
    - VMwareにはesxcli、vsish、vim-cmd、vmkfstoolsなどの管理コマンドがあるので、それらを活用して情報を取得

- 各物理コンポーネントにおける情報取得方法について
    - NIC
        - SmartNIC(物理NIC)はIBM Cloud管理のため不要
        - PCI Interface(ESXiが認識するポート)に関してはESXiからのSNMP Trap、もしくはesxcli storage core adapter listのステータスで確認可能
    - ストレージ
        - RAIDコントローラーの管理ユーティリティーで確認
        - BMS for VPCではMarvellの88SE9230というオンボードのRAIDコントローラーを使用しており、OSから制御できるのでストレージの情報は取れる可能性がある(未確認)
        - また、テンプレート適用によりvCenter側で個別のディスクごとの使用状況が取得できているので、障害箇所については特定できる可能性はある
        - vmkernel.logとvobd.logに記載されるログにはディスク障害の情報があるため、ログを確認する(Zabbixの機能ではない)    
    - メモリー
        - cim-diagnostic.sh、smbiosDumpでメモリーの物理情報が出力可能
        - smbiosDump は空いているスロットも含め、全てのメモリースロットの情報が出てくるので障害箇所の特定に使える可能性あり


クラウドサービスのため、状況は日々更新されます。IPMIからの情報が取得できるようになる機能の実装などに期待しています。また、お客様がサービスにおける全ての運用責任を担うわけではありません。運用責任をユーザー側とクラウド事業者とで共有するモデルが適用されます。障害が疑われる場合にはIBM CloudのCaseを発行し、適切な対応方法を確認するようにしましょう。