**** 留意事項 *****
こちらのブログの内容はDECN(Dell EMC Community Network)に投稿されたブログの再掲です。
DECNが近い将来に廃止となるためこちらに移行させていただいております。
内容についてはオリジナルの執筆当時のものとなりますので最新ではない場合がありますがご容赦ください。
アラーム定義情報を一括で取得したい!
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情報があれば環境に合わせて自由に必要な情報を抽出・成形できると思います。
この記事の内容がお役に立てれば幸いです。