vCenter に定義されているアラーム定義のダンプを取得する方法

 

アラーム定義情報を一括で取得したい!

 

VxRailのログを見ていると、ときどき突如としてalarm-xx が現れることがあります。

 

 

alam-xxはvCenterで定義されている個々のアラームに対応するMoref IDなので、当然ながらそれに対応するアラーム定義があるのですが、残念ながらMoref IDは環境によって異なりますし、(あるかもしれませんが)ID採番のRuleなどもなさそうなのでMorefIDだけからアラームの詳細を予測することができません。

 

 

 

そのため、何かが起きていることはわかるのですが、「何が起きているの!!??」とちょっとドキドキしてしまいます。

そういう時、「全部のAlarmのMorefIDと対応する情報が一括で取得できたらいいのに・・・」と常々思っていました。

 

 

 

また、運用管理者の観点からも現在のシステムに定義されているアラームの一覧やダンプを取得したい!ということはあるかと思います。

 

 

しかしながら、WebClientや標準のコマンドとしてアラーム定義の細かい情報を一括でExportしたりする方法は見当たりませんでした。

アラーム名と定義場所は出せるかも知れませんが細かいトリガーやアクションの情報となるとWebClientから一つ一つコピー&ペーストするような作業になってしまうのでとてもやる気になりません。

 

 

ということで、今回はvSphere SDK for pythonを利用して、VCSA CLI上で一括でアラーム定義情報をDumpスクリプトを作成しましたので、使用方法と合わせて共有させていただきます。

 

 

開発・検証環境

 

今回のスクリプトは以下の環境で動作検証をしました。

多少Versionが違っても動くとは思います。

もし動かなかったらコメント等で教えていただければ、時間があるときに修正します。

もちろんご自由にスクリプトを書き換えていただいてもかまいません。

 

VxRail™ Appliance 4.5.229

VMware vCenter Server Virtual Appliance (vCSA) 6.5 U2c GA build 9451637

VMware ESXi 6.5 Express Patch 11 GA build 10719125

 

 

 

使用方法

 

いざ、スクリプトファイルと添付して使用方法を書くぞ!、、、と思った段階で初めて気づきましたが、このブログはファイルの添付ができないんですね。。。仕方ないのでソースを直に書きます。

HTMLによる不必要な改行の挿入などによるコード破壊を防ぐため、あえてフォーマットを無効にしています。

少し見栄えが悪いですがご容赦ください。

pythonは文法上、改行やインデントにシビアなのでコピペする際にご留意ください。不必要な空行や、スペースが一つ挿入されただけでも動かなくなります。

 

#####   ここから ######   

# coding:utf-8
#!/usr/bin/env python

from __future__ import print_function
from __future__ import unicode_literals
import os
import codecs
import subprocess
import re
import string
import json
import ssl
import sys
import traceback
import atexit
import platform
import time
import datetime
import socket
import getpass
import argparse

sys.path.append("/usr/lib/vmware/site-packages/")

from pyVmomi import vim, vmodl
from pyVim import connect
from pyVim.connect import SmartConnect, Disconnect
from pyVim.task import WaitForTask


def parse_argument():
    parser = argparse.ArgumentParser(description='Print All Alarm Definition')
    parser.add_argument('-s', '--server', dest="server", required=True, help='vCenter IP Address')
    parser.add_argument('-u', '--username', dest="username", required=True, help='vCenter SSO admin username')
    parser.add_argument('-p', '--password', dest="password", required=True, help='vCenter SSO admin password')
    args = parser.parse_args()
    return args



def main():
    args = parse_argument()
    vcipaddr = args.server
    vcusername = args.username
    vcpassword = args.password
    context = None
    context = ssl.create_default_context()
    context.check_hostname = False
    context.verify_mode = ssl.CERT_NONE
    si = connect.Connect(host = vcipaddr,user = vcusername,pwd = vcpassword)
    atexit.register(Disconnect, si)
    
    alarms = si.content.rootFolder.declaredAlarmState
    for alarm in alarms:
        print(alarm.alarm.info)

if __name__ == '__main__':
    main()

#####  ここまで  #######  

 

 

↑上記の内容をVCSAの適当な場所にdump_AlarmDefinition.pyとして保存してください。

 

保存したら以下のSyntaxで実行してみてください。

 

root@vc [ ~ ]# python dump_AlarmDefinition.py -s <vcenter ip> -u <vcenter sso user> -p '<vcenter sso user password>'

 

パスワードに特殊文字が含まれる場合は、シングルクォーテーションで括ってください。

例は以下です。

※例にあるパスワードはVMware HOLで用いられるものを仮で使用しており、その他の意味はありません。

 

実行例:

root@vc [ ~ ]# python dump_AlarmDefinition.py -s localhost -u administrator@vsphere.local -p 'VMware1!'

 

 

サンプル出力:

root@vc [ ~ ]# python dump_AlarmDefinition.py -s localhost -u administrator@vsphere.local -p 'VMware1!'
(vim.alarm.AlarmInfo) {
   dynamicType = <unset>,
   dynamicProperty = (vmodl.DynamicProperty) [],
   name = 'Host Requires Encryption Mode Enabled Alarm',
   systemName = 'alarm.HostRequiresEncryptionModeEnabledAlarm',
   description = 'Alarm to indicate that the host requires encryption mode enabled.',
   enabled = true,
   expression = (vim.alarm.OrAlarmExpression) {
      dynamicType = <unset>,
      dynamicProperty = (vmodl.DynamicProperty) [],
      expression = (vim.alarm.AlarmExpression) [
         (vim.alarm.EventAlarmExpression) {
            dynamicType = <unset>,
            dynamicProperty = (vmodl.DynamicProperty) [],
            comparisons = (vim.alarm.EventAlarmExpression.Comparison) [],
            eventType = vim.event.EventEx,
            eventTypeId = 'com.vmware.vc.host.Crypto.ReqEnable.KeyMissingOnKMS',
            objectType = vim.HostSystem,
            status = 'red'
         },
         (vim.alarm.EventAlarmExpression) {
            dynamicType = <unset>,
            dynamicProperty = (vmodl.DynamicProperty) [],
            comparisons = (vim.alarm.EventAlarmExpression.Comparison) [],
            eventType = vim.event.EventEx,
            eventTypeId = 'com.vmware.vc.host.Crypto.ReqEnable.KMSClusterError',
            objectType = vim.HostSystem,
            status = 'red'
         },
         (vim.alarm.EventAlarmExpression) {
            dynamicType = <unset>,
            dynamicProperty = (vmodl.DynamicProperty) [],
            comparisons = (vim.alarm.EventAlarmExpression.Comparison) [],
            eventType = vim.event.EventEx,
            eventTypeId = 'com.vmware.vc.crypto.HostKeyUpdatedEvent',
            objectType = vim.HostSystem,
            status = 'green'
         },
         (vim.alarm.EventAlarmExpression) {
            dynamicType = <unset>,
            dynamicProperty = (vmodl.DynamicProperty) [],
            comparisons = (vim.alarm.EventAlarmExpression.Comparison) [],
            eventType = vim.event.EventEx,
            eventTypeId = 'com.vmware.vc.host.Crypto.Enabled',
            objectType = vim.HostSystem,
            status = 'green'
         }
      ]
   },
   action = <unset>,
   actionFrequency = 0,
   setting = (vim.alarm.AlarmSetting) {
      dynamicType = <unset>,
      dynamicProperty = (vmodl.DynamicProperty) [],
      toleranceRange = 0,
      reportingFrequency = 300
   },
   alarmMetadata = <unset>,
   key = 'alarm-1',
   alarm = 'vim.alarm.Alarm:alarm-1',
   entity = 'vim.Folder:group-d1',
   lastModifiedTime = 2018-12-01T17:27:21.718Z,
   lastModifiedUser = '',
   creationEventId = 0
}
 
........... 以降、全アラーム情報がDumpされる

 

 

問題なく情報をダンプすることができました。

出力がかなり長くなりますのでリダイレクトなどしてファイルにいったんファイルに出力するのがお勧めです。

アラーム定義のオブジェクト情報がそのまま表示されているので見にくいですが、アラーム定義の情報をすべて網羅しているのでテキスト処理などで必要な部分のみを抽出したりできますし、またソースを変更して、名前とトリガーとアクション情報のみを抽出することも可能です。

 

例えばスクリプト中の

 

print(alarm.alarm.info)

 

の部分を

 

print(alarm.alarm.info.name)

print(alarm.alarm.info.expression)

print(alarm.alarm.info.action)

 

とすれば、アラーム定義の名前とトリガー&アクション部分のみを抽出できます。

※pythonなのでインデントや改行には注意してください。↑はHTMLのフォーマットを無効にしていません

 

 

いかがでしたでしょうか?実際に業務で使える情報抽出まではあと一段階の処理が必要となるとおもいますが、

テキスト処理やpythonであればいくらでも有識者はいますので、このDump情報があれば環境に合わせて自由に必要な情報を抽出・成形できると思います。

 

この記事の内容がお役に立てれば幸いです。

コメント

このブログの人気の投稿

vSwitchにSTPが不要な理由

ESXi に DNS サーバを何個まで登録できるか

障害でVDSから切断されたVCSAの復旧方法