Last active
September 10, 2017 12:46
-
-
Save sky-joker/294f86b79a84406bb3afa03b152258d0 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='exec-guestos-cmd', | |
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 | |
# ゲストプログラムスペクを作成 | |
guest_program_spec = vim.vm.guest.ProcessManager.ProgramSpec() | |
guest_program_spec.arguments = 'TEST > output.txt' | |
guest_program_spec.programPath = '/usr/bin/echo' | |
# ゲストOSのコマンドを実行 | |
r = content.guestOperationsManager.processManager.StartProgramInGuest( | |
vm=vm_mob, | |
auth=guest_auth, | |
spec=guest_program_spec | |
) | |
# 結果を出力 | |
print(r) | |
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