Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
pyvmomiでGuest OSのプロセス一覧を取得する
#!/usr/bin/env python3
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim, vmodl
from getpass import getpass
import ssl
import atexit
import argparse
import sys
def options():
"""
コマンドラインオプション設定
:rtype: class
:return: argparse.Namespace
"""
parser = argparse.ArgumentParser(prog='get-guestos-processes',
add_help=True,
description='ゲストOSのプロセス一覧を取得する例')
parser.add_argument('--host', '-vc',
type=str, required=True,
help='vCenterのIP又はホスト名')
parser.add_argument('--username', '-u',
type=str, default='administrator@vsphere.local',
help='vCenterのログインユーザー名(default:administrator@vsphere.local)')
parser.add_argument('--password', '-p',
type=str,
help='vCenterのログインユーザーパスワード')
parser.add_argument('--targetvm', '-tvm',
type=str, required=True,
help='対象の仮想マシンを指定')
parser.add_argument('--guestuser', '-gu',
type=str, required=True,
help='Guest OSのユーザーを指定')
parser.add_argument('--guestpassword', '-gp',
type=str,
help='Guest OSのユーザーパスワードを指定')
args = parser.parse_args()
if(not(args.password)):
args.password = getpass(prompt='vCenter Password:')
if(not(args.guestpassword)):
args.guestpassword = getpass(prompt='Guest OS Password:')
return args
def get_mob_info(content, mob, target=''):
"""
Management Objectを取得する。
targetが指定されていない場合はContainerView(https://goo.gl/WXMfJK)で返す。
:type content: vim.ServiceInstanceContent
:param content: ServiceContent(https://goo.gl/oMtVFh)
:type mob: Management Object
:param mob: 取得する対象のManagement Objectを指定
:type target: str
:param target: 返すmobの名前を指定
:rtype: Management Object
:return: 指定したManagement Object又はContainerViewを返す
"""
r = content.viewManager.CreateContainerView(content.rootFolder,
[mob],
True)
# 返すmobを名前で指定する場合
if(target):
for i in r.view:
if(i.name == target):
r = i
return r
def login(args):
"""
ServiceContentオブジェクトを返す。
:rtype: class
:return: pyVmomi.VmomiSupport.vim.ServiceInstanceContent
"""
# SSL証明書対策
context = None
if hasattr(ssl, '_create_unverified_context'):
context = ssl._create_unverified_context()
# 接続
si = SmartConnect(host = args.host,
user = args.username,
pwd = args.password,
sslContext = context)
# 処理完了時にvCenterから切断
atexit.register(Disconnect, si)
# ServiceContent(Data Object)を取得
content = si.content
return content
def check_vmware_tools_status(vm_mob):
"""
ゲストOSのVMware toolsのステータスを確認します。
"""
vmware_tools_status = vm_mob.guest.toolsStatus
if(not(vmware_tools_status == 'toolsOk')):
sys.stderr.write("%s: VMware toolsが動作していません\n" % vm_mob.name)
sys.exit(1)
def main(args):
# ServiceContent.
content = login(args)
# 仮装インスタンスのmobを取得
vm_mob = get_mob_info(content, vim.VirtualMachine, args.targetvm)
check_vmware_tools_status(vm_mob)
# ゲストOSアカウント設定
guest_auth = vim.vm.guest.NamePasswordAuthentication()
guest_auth.username = args.guestuser
guest_auth.password = args.guestpassword
# ゲストOSのプロセス一覧を取得
r = content.guestOperationsManager.processManager.ListProcessesInGuest(
vm=vm_mob,
auth=guest_auth
)
# 結果を出力
for r_obj in r:
print("%s: %s" % (r_obj.pid, r_obj.cmdLine))
if __name__ == '__main__':
args = options()
main(args)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.