Last active
March 16, 2022 20:53
-
-
Save sky-joker/58c63b5f48201a9aeb56a537a5a91720 to your computer and use it in GitHub Desktop.
pyvmomiでGuest OSのプロセス一覧を取得する
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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