pysphere VMware控制模块的一些函数的说明
对于虚拟机的操作
获得虚拟机对象
当你正常连接了服务器后,你就可以使用以下两种方式来得到虚拟机对象。
- get_vm_by_path
- get_vm_by_name
虚拟机路径可以从虚拟机右键信息中的”Edit settings…”的Options标签页中的”Virtual Machine Configuration File”得到。
!注意
建议使用虚拟机路径来的到虚拟机对象,对于一个虚拟机来说,路径是唯一的,而名字有可能重复,当然我们后面会说如何利用限定条件参数来减少重复,但一旦出现重复结果,该函数只返回找到的第一个结果。
>from pysphere import VIServer
>server = VIServer()
>server.connect("192.168.100.100", "administrator@vsphere.local
", "vmware")
>vm1 = server.get_vm_by_path("[DataStore1] Ubantu/Ubantu-10.vmx")
>vm2 = server.get_vm_by_name("Windows XP Professional")
附加限定条件的使用方法
>vm1 = server.get_vm_by_path("[DataStore1] Ubuntu/Ubuntu-10.vmx", "DEVELOPMENT")
>vm2 = server.get_vm_by_name("Windows XP Professional", "IT")
其中的限定条件为datacenter
获得虚拟机状态
>print vm1.get_status()
返回结果为字符串类型
* ‘POWERED ON’
* ‘POWERED OFF’
* ‘SUSPENDED’
* ‘POWERING ON’
* ‘POWERING OFF’
* ‘SUSPENDING’
* ‘RESETTING’
* ‘BLOCKED ON MSG’
* ‘REVERTING TO SNAPSHOT’
前三个为基础状态,一般情况下虚拟机都会处于这三个状态下。
“VMware Server/ESX/ESXi”等服务器由于不支持查询历史动作,他们只会返回基础状态。
你也可以使用参数来限定只返回基础状态
>print vm1.get_status(basic_status=True)
你也可以通过方法查询虚拟机是否处于某种状态
>print vm1.is_powering_off()
>print vm1.is_powered_off()
>print vm1.is_powering_on()
>print vm1.is_powered_on()
>print vm1.is_suspending()
>print vm1.is_suspended()
>print vm1.is_resetting()
>print vm1.is_blocked_on_msg()
>print vm1.is_reverting()
获得虚拟机基础属性
- get_properties
- get_property(property_name)
get_properties返回一个python字典类型数据,包含查询时刻的所有可用属性。
get_property返回一个指定属性的值,如果该属性不存在,则返回None
>vm1.get_properties()
{'guest_id': 'ubuntuGuest',
'path': '[DataStore1] Ubuntu/Ubuntu-10.vmx',
'guest_full_name': 'Ubuntu Linux (32-bit)',
'name': 'Ubuntu 10.10 Desktop 2200',
'mac_address': '00:50:56:aa:01:a7'
}
>print vm1.get_property('mac_address')
'00:50:56:aa:01:a7'
由于某些原因,pysphere在创建虚拟机实例时,所有属性值都被缓存起来,每次请求属性时也会更新缓存,而这些属性都是时时变化的,如果需要确实得到最新的属性值,需要加入from_cache=False参数
>print vm1.get_property('ip_address', from_cache=False)
>print vm1.get_properties(from_cache=False)
没个虚拟机实例包含下面这些属性
* name
* path
* guest_id
* guest_full_name
* hostname
* ip_address
* mac_address
* net
获得资源池名称
执行下面语句来得到虚拟机的资源池名称
>print vm1.get_resource_pool_name()
Linux VMs
改变虚拟机电源状态
执行下面语句来操作虚拟机电源
>vm1.power_on()
>vm1.reset()
>vm1.suspend() #since pysphere 0.1.5
>vm1.power_off()
默认情况,以上语句会同步执行,也就是说这个方法一直等到虚拟机动作完才会退出。
如果需要异步执行,需要加入sync_run=False参数。在异步下,方法会返回一个task对象,用来查询执行进度和结果。
关于task对象的使用,稍后讲解。
>task1 = vm1.power_on(sync_run=False)
>task2 = vm2.reset(sync_run=False)
>task3 = vm2.suspend(sync_run=False) #since pysphere 0.1.5
>task4 = vm3.power_off(sync_run=False)
另外还有一个host参数,没搞明白有什么利用价值,请了解的朋友们留言。
>vm1.power_on(host="esx3.example.com")
操作快照
快照有三种操作:恢复,创建,删除。
1)我们先来看看恢复。
有三个方法可以将一台虚拟机恢复到某个快照。
- revert_to_snapshot:恢复到最新的快照
- revert_to_named_snapshot:恢复到能与给定的名字第一个匹配的快照。规则不明,需要试验。
- revert_to_path:恢复到指定的路径或索引标示的快照。index参数用于指定同一个路径的快照的第几次更新,默认为0。使用方法为:vm1.revert_to_path(“/base/updated”, index=1)
和虚拟机电源控制类似,操作快照也是默认同步执行的。如果需要异步执行,需按照下面方法执行。
>task1 = vm1.revert_to_snapshot(sync_run=False)
>task2 = vm2.revert_to_named_snapshot("base", sync_run=False)
>task3 = vm3.revert_to_path("/base/updated", sync_run=False)
另外也有一个host参数,依然不明白,搞明白后更新
>vm1.revert_to_snapshot(host="esx1.example.com")
>vm1.revert_to_named_snapshot(host="esx2.example.com")
>vm1.revert_to_path(host="esx3.example.com")
2)再来看看删除快照
与恢复相似,删除也有三个方法
- delete_current_snapshot
- delete_named_snapshot(name)
- delete_snapshot_by_path(path, index=0)
与恢复不同的是,删除有一个特有的remove_children的参数,但这个参数设置为True时,指定的快照的所有子快照都会被删除
3)创建快照
下面的语句用于创建现在时刻的快照
>vm1.create_snapshot("mysnapshot")
如果需要对这个快照有一个描述,用description参数来实现
>vm1.create_snapshot("mysnapshot", description="With SP2 installed")
创建快照同样也可以使用sync_run参数来异步执行。
在pysphere 0.1.6以上版本,加入了两个特有的参数
- memory:默认为True,包含内存完全快照,如果没成功,快照会被设置为关机状态。
- quiesce:默认为True,按照磁盘静默方式创建快照,可以保证快照被创建的时刻,虚拟机和快照完全一致。如果是关机状态创建快照,或VMware tools没被安装,则这个忽略这个参数。
4)取得快照列表
>snapshot_list = vm2.get_snapshots()
这样就得到了一个快照列表,其中的每一个快照实例可以使用下面方法来取得属性值。
- get_name: 返回快照名称
- get_description: 返回快照描述
- get_create_time: 返回快照创建时间
- get_parent: 返回该快照的父快照,是一个快照实例。如果是根快照,则返回None。
- get_children: 返回该快照的子快照,是一个快照列表。
- get_path: 返回该快照的父子关系,使用’/’分割。
- get_state: 返回这个快照恢复时虚拟机的电源状态。
操作虚拟机内在系统
1)电源管理
使用下面命令来使虚拟机关闭,重启,睡眠
>vm1.shutdown_guest()
>vm1.reboot_guest()
>vm1.standby_guest()
2)登录系统
>vm1.login_in_guest("os_username", "os_password")
任何除电源管理以外的操作都需要事先登录系统,这项操作需要vSphere 5.0以上,并且虚拟机必须安装vmware tools。
这项操作没有返回值,没有异常信息就是成功了。
3)文件和目录操作
- make_directory(path, create_parents=True): 根据path参数在虚拟机中建立一个目录, 默认建立所有不存在的父目录。如果create_parents参数设置为False则不自动创建父目录,不存在父目录是发生异常。
- move_directory(src_path, dst_path): 将目录从src_path移动到dst_path,一般也用于目录重命名。如果目标目录存在则发生异常。
- delete_directory(path, recursive): 删除path指向的目录。recursive是必须指定的,True所有子目录和文件也一同删除,相反False时如果存在子目录或文件则发生异常。
- list_files(path, match_pattern=None): 返回参数path所指定的目录下所有文件和目录的列表,包括隐藏的,只显示一层,不显示子层。 match_pattern参数是一个perl-compatible正则表达式,利用这个参数我们可以过滤得到的结果。这个方法的返回值是一个字典列表,其中每一个字典元素包含下面三种属性。
- path: 这个文件的全路径
- size: 文件大小
- type: 文件类型directory, file, symlink之一
- get_file(guest_path, local_path, overwrite=False): 从虚拟机中的guest_path得到一个文件,保存到本机的local_path。
- send_file(local_path, guest_path, overwrite=False): 从本机的local_path发送一个文件到虚拟机的guest_path。
- move_file(src_path, dst_path, overwrite=False): 将文件从src_path移动到dst_path,一般也用于目录重命名。如果overwrite 被设置为False(默认为False)并且dst_path存在,则异常。如果设置为True,则所有存在的文件将都被覆盖,如果dst_path是个目录则异常。
- delete_file(path): 删除path所指向的文件。
4)进程操作和环境变量
- start_process(program_path, args=None, env=None, cwd=None): 在虚拟机中开启一个程序,并返回PID。参数program_path是程序的绝对地址,如果在系统环境变量path中有该程序,可以直接填写程序名。程序参数:
- args: 程序的参数列表,字符串列表型。
- env: 程序的环境变量列表,字典列表型。
- cwd: 程序的工作目录。为一个绝对路径。如果不设置,则默认使用系统登录后的默认路径。比如linux为/home/loginuser,windows为c:\windows\system32之类。
- terminate_process(pid): 杀掉pid所代表的进程。
- list_processes()*: 罗列系统正在运行的所有进程,包含最近使用start_process创建的已完成的进程。返回结果为字典列表,每一个字典型对象包含以下属性:
- start_time: 进程的创建时间。
- end_time: 进程的结束时间。特指使用start_process创建的进程并且已结束不足5分钟,否则返回None。
- pid: 进程的PID。
- name: 进程名。
- cmd_line: 完整的命令行内容,包含命令和参数等。
- owner: 进程所属用户。
- exit_code: 进程返回值。特指使用start_process创建的进程并且已结束不足5分钟,否则返回None。
- get_environment_variables(): 读取所有的系统环境变量。返回值为字典列表。
克隆虚拟机
pysphere 0.1.6开始提供这项功能。
>new_vm = vm1.clone("Clone Name")
该方法返回一个虚拟机实例。除必须指定的新虚拟机名外,还有下面几个参数可以设置:
- sync_run:是否同步执行,默认值为True。同步时返回虚拟机实例,异步时返回taskid。
- folder:新虚拟机的目标目录。如果没设置,默认放在源虚拟机同一目录中。
- resourcepool:新虚拟机使用的MOR,如果没设置,默认使用源虚拟机同样的资源池。(还没闹明白MOR,后补)
- power_on:新虚拟机创建后是否开机,默认为True。
- template:是否把新虚拟机作为模板,默认为False。
!注意
如果将新虚拟机作为模板,则resourcepool参数不起作用。相反,如果源虚拟机是一个模板,则必须指定resourcepool参数。
迁移虚拟机
>vm1.migrate()
- sync_run:同步执行
- priority:优先级,可选项为default,high,low。
- resource_pool</em>:目标资源池
- host:目标主机
- state:执行迁移的电源状态,当且仅当虚拟机处于指定状态是,才执行迁移。可选项为POWERED ON,POWERED OFF,SUSPENDED。
处理异步作业
上面提到了很多可以指定sync_run=False参数的方法来进行异步执行。
异步执行时,方法会返回一个VITask的实例,它包含以下方法:
- get_state:返回现在时刻这个作业的状态。状态如下:
- "error": 作业异常退出。
- "queued": 作业在队列中,未执行。
- "running": 作业正在执行。
- "success": 作业正常执行完了。
- get_error_message:作业异常退出的错误描述。
- wait_for_state(['error','success','running'], timeout=10): 该方法等待作业出现给定的状态列表里面的某一个状态。当等到,返回这个状态。如果在timeout规定的秒时间里没有出现任何一个期盼的状态则发生异常。