Windows软件测试探秘
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 如何设计解决问题

1.2.1 环境如何自动化快照备份管理

提到环境的快照备份管理,大家最容易想到的是虚拟机的快照备份管理功能。

虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。

通过虚拟机软件,可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作。例如可以安装操作系统、安装应用程序、访问网络资源等。使用虚拟机的快照功能,可以在任意时刻对环境的当前状态进行快照备份,然后在任意时刻恢复环境到某个快照状态。

下面介绍我们即将采用的两款虚拟机软件,来进行环境快照备份管理。

1.VMware Workstation

VMware Workstation 是一款功能强大的桌面虚拟计算机软件(VMware 的官网为http://www.vmvare.com/,有需要的读者请在官网查询),提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试、部署新的应用程序的最佳解决方案。VMware Workstation可在一台实体机器上模拟完整的网络环境,以及可便于携带的虚拟机器,其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。对于企业的IT 开发人员和系统管理员而言,VMware 在虚拟网络、实时快照、拖曳共享文件夹、支持PXE等方面的特点使它成为必不可少的工具。

但是VMware Workstation也有其缺点。

(1)性能问题

VMware Workstation是部署在Windows操作系统上的,虚拟机对底层硬件的操作,必须要经过“臃肿”的 Windows 操作系统进行“代理”操作,这对于性能来说,绝对是个致命的缺点。大部分系统资源都被Windows操作系统占用了。

(2)程序控制

VMware Workstation并没有提供任何API来控制虚拟机的各种行为,用户必须在Windows 操作系统上运行虚拟机管理软件,在管理软件界面进行启动、快照、关闭虚拟机等操作,这对于大规模的虚拟机管理而言,成本高得令人不敢想象。

2.VMware ESX

ESX Server是一种企业级虚拟化工具。它利用能够管理许多虚拟机的服务程序进行工作,比VMware另外的基础服务产品具有更高的可靠性和效率。

ESX完美地解决了Workstation的两个致命缺点。

(1)性能改进

ESX Server运行在“裸机”上。这在本质上意味着将ESX Server软件直接安装在计算机上,不需要有一个让它可以运行在其上的操作系统。图1-1说明了此原理。

图1-1 ESX Server基本实现

ESX基于Linux内核的VMkernel进行管理。该微内核通过消除在虚拟机下面运行一个基本操作系统所需的系统开销而节省了资源。该产品将资源从物理机器和虚拟机的多个模拟复制品中分离出来,供虚拟机使用。它甚至还有过量使用内存的功能,这意味着虚拟机的内存总和可以安全地超越服务器的实际物理内存。此功能可以提高服务器内存的整体利用效率。

(2)程序控制

ESX提供一套丰富的脚本命令,通过这些脚本命令可以非常方便地对ESX上部署的虚拟机进行各种控制,如启动、快照、关闭等。这对于大规模虚拟机管理绝对是个“致命诱惑”。

综上,直接运行在系统硬件上的 VMware ESX 服务器为部署、管理和远程控制多虚拟机提供了一个安全,唯一的平台。有了VMware ESX服务器,则:

● 服务器能从任何地方被远程管理,简化服务器维护。

● 通过高级资源管理控制,服务质量能得到保证。

● 普通的监控和管理任务是自动脚本式的。

● 无须添加新的物理系统,性能得到明显提升。

3.基于ESX实现自动化快照备份管理

关于ESX系统的部署及ESX上虚拟机安装配置,请读者自行阅读ESX相关资料,本章篇幅有限,不再赘述。

VMware提供了命令行管理虚拟机的接口,即vmware-cmd、vmrun,通过这两个命令行接口可以完成对虚拟机的诸多操作,比如重启、关闭、开机、配置快照等。

下面通过实际例子进行详细介绍。

    #!/bin/sh
    cmd="vmware-vim-cmd"
    case $1 in
    isvmon)
    result=`ssh root@$2 $cmdvmsvc/power.getstate  $3 2>&1 | grep "Powered on"`
            ;;
        poweron)
    vmname=`ssh root@$2 $cmdvmsvc/getallvms |awk '{ if ($1 == '"$3"') print $4}'`
    result=`vmrun -T esx -h https://$2/sdk -u root -p 123456 start "[datastore1]
$vmname"`
        ;;
              poweroff)
        vmname=`ssh root@$2 $cmdvmsvc/getallvms |awk '{ if ($1 == '"$3"') print $4}'`
    result=`vmrun -T esx -h https://$2/sdk -u root -p 123456 stop "[datastore1]
$vmname"`
              ;;
              getip)
            result=`ssh root@$2 /usr/bin/$cmdvmsvc/get.summary $3 2>&1 | grepipAddress|
  grep -v "unset"|cut -d '"' -f 2`
                ;;
                copyfile)
        result=`vmrun -T esx -h https://$2/sdk -u root -p 123456 -gu Administrator -gp
  $5 CopyFileFromHostToGuest  "[datastore1] $3" /var/www/html/proxy/$4 'c:\\vmCenter\\
  '$4`
                ;;
            snapshot)
        vmname=`ssh root@$2 $cmdvmsvc/getallvms |awk '{ if ($1 == '"$3"') print $2}'`
                  result=`/usr/lib/vmware-vcli/apps/vm/vmsnapshot.pl --url https://$2/
  sdk/webService --username root --password 123456 --vmname $vmname --sname $4 2>&1 |grep
  completed`
                  ;;
        revertToSnapshot)
        vmname=`ssh root@$2 $cmdvmsvc/getallvms |awk '{ if ($1 == '"$3"') print $2}'`
                  result=`/usr/lib/vmware-vcli/apps/vm/snapshotmanager.pl --url https://$2/
  sdk/vimService --username root --password 123456 --operation goto --vmname $vmname
  --snapshotname $4 2>&1 |grep successfully`
                  ;;
            deleteSnapshot)
        vminfo=`/usr/bin/ssh root@$2 $cmdvmsvc/getallvms |/bin/awk '{ if ($1 == '"$3"')
  print $4}'`
        result=`/usr/bin/vmrun -T esx -h https://$2/sdk -u root -p 123456 deleteSnapshot
  "[datastore1] $vminfo" $4`
                  ;;
        getVmxByVmid)
        result=`ssh root@$2 $cmdvmsvc/getallvms |awk '{ if ($1 == '"$3"') print $4}'`
                ;;
        getVmnameByVmid)
        result=`ssh root@$2 $cmdvmsvc/getallvms |awk '{ if ($1 == '"$3"') print $2}'`
        ;;
        getvmstatus)
        result=`ssh root@$2 $cmdvmsvc/power.getstate $3 2>&1|grep "Powered on"`
                ;;
            *)
            exit
            ;;
        esac


        if [ "$result" = "" ];then
        echo 1
    exit
    fi

以上脚本的用途是从中控机上远程控制其他机器上的ESX虚拟机,通过ssh在目标机器上执行ESX脚本命令vmware-vim-cmd。脚本提供了如下几个常用操作。

● isvmon:判断虚拟机是否在启动状态。vmware-vim-cmdvmsvc/power. getstate参数获取虚拟机状态信息,如果虚拟机处于启动状态,会有“Powered on”关键字,进而作出判断。

● poweron:启动虚拟机,首先获取虚拟机名称 vmname,然后通过 vmrun start启动vmname对应的虚拟机。

● poweroff:关闭虚拟机,首先获取虚拟机名称 vmname,然后通过 vmrun stop关闭vmname对应的虚拟机。

● getip:获取虚拟机IP,vmware-vim-cmdvmsvc/get.summary的输出信息包含了IP地址。

● copyfile:从中控机本地复制文件到远端 ESX 虚拟机上。vmrunCopyFileFrom HostToGuest命令实现了文件复制功能。

● snapshot:对某个远端虚拟机进行创建快照操作,通过/usr/lib/vmware-vcli/apps/vm/vmsnapshot.pl脚本实现。

● revertToSnapshot:将某个远端虚拟机恢复到某个快照状态,通过/usr/lib/vmware-vcli/apps/vm/snapshotmanager.pl脚本实现。

● deleteSnapshot:删除某快照,通过vmrundeleteSnapshot命令删除。

● getVmxByVmid、getVmnameByVmid、getvmstatus 三部分分别获取虚拟机的信息。

以上脚本只列举了部分ESX常用的虚拟机控制脚本命令,更多信息请参考ESX提供的官方命令文档。通过以上脚本可以看出,ESX 提供了足够丰富的脚本命令来获取虚拟机信息及控制虚拟机,对环境自动化部署、快照、管理提供了强有力的支持。

1.2.2 应用软件如何自动化部署

1.静默安装

应用软件自动化部署,主要是指不需要用户手工干预,由脚本或程序自动执行应用软件的安装部署,方式采用默认设置。

用户在执行测试用例时,假如某些测试场景需要部署若干应用软件,如测试某款客户端软件与浏览器的兼容性,目前主流浏览器应该在10个以上,用户需要自己手工下载各浏览器的最新版本,然后一个一个安装,很是费时,因此自动化部署应用软件就显得很重要了。

大部分应用软件都支持静默安装方式,即可以通过脚本运行安装文件,运行时指定相关参数即可静默安装。下面介绍几种应用软件常用的静默安装方法。

常见软件安装包制作有以下几种方法。

(1)inno setup

静默安装方式:setup.exe /sp- /silent /norestart

(2)Installshield

静默安装方式:setup.exe -s [-sms]

(3)Nsis

静默安装方式:Setup.exe /S

也可以用/D 参数选择将要安装的目标分区和文件夹,例如:Setup.exe /S/D=E:\Software\xxx

(4)Microsoft windows installer

可以使用/QB和/QN 参数进行自动安装。

● /qb 会在窗口中显示一个基本的安装进程。

● /qn 参数则不会显示任何窗口,直接在后台自动安装。

(5)Wise

可用/silent参数进行静默安装。

2.自动下载安装包

软件自动化部署,除了上面提到的静默安装、ESX远程复制文件(安装包)之外,还需要能够根据指定URL自动下载软件安装包。

下载可以到主流的软件资源站点或软件对应的官方网站链接,具体下载方式多种多样,读者可以自行开发相关下载小工具或脚本,以下给出几种常用方法。

(1)基于 libcurl 开发下载工具或脚本,libcurl 当前支持 HTTP,HTTPS,FTP, Gopher,Telnet,Dict,File和Ldap协议。libcurl同样支持HTTPS证书授权。

(2)基于P2SP程序,可以借助于主流下载软件提供的开放平台,调用相关API,这样可以很好地保证下载速度和性能。

1.2.3 环境资源池系统管理

对于一定规模的技术团队,无论是开发还是测试人员,都会经常与软件测试环境打交道。当面临一定规模的硬件及软件测试环境时,需要高效的环境资源池管理系统,才能将资源的利用效率发挥到极致。

1.测试环境管理系统模型

图1-2给出了环境资源池管理系统模型。

图1-2 测试环境管理系统模型

(1)用户,环境资源需求者。

(2)管理员,环境资源管理系统运维者。

(3)虚拟机、快照,基于一定规模的硬件机器集群,部署的各类测试环境虚拟机及快照。

(4)系统功能——浏览,用户可以在管理系统界面浏览全部虚拟机及快照,对资源有整体了解及找到自己所需。

(5)系统功能——定制,用户可以根据若干定制条件,由管理系统自动调度分配符合需求的空闲资源,如根据系统、应用软件等内容进行定制。

(6)系统功能——霸占,用户在浏览资源找到自己所需时,若资源处于空闲状态,可以直接霸占使用,处于使用状态时,其他用户不能霸占使用。

(7)系统功能——提交应用软件,由管理员提前部署的应用软件列表肯定不能满足用户百分百的需求,因此系统需要提供一个入口,当用户所需应用软件在系统中不存在时,用户可以提交相关应用软件的下载地址链接,系统自动下载并部署到用户使用的虚拟机上。

(8)系统功能——后台管理运维,如用户账户申请确认、机器维护、环境资源原始部署等,相当于系统的后端MIS管理系统。

2.测试环境管理系统整体设计与实现

测试环境管理系统整体实现架构如图1-3所示。

图1-3 测试环境管理系统整体实现架构

(1)Web UI

作为与用户交互的环境管理系统,最主要的目标是向用户清晰地呈现所提供的测试环境资源,让用户对测试环境资源一目了然,方便快捷地找到自己需要的测试环境,并能快速使用;同时,也需要能够方便地进行快照、归还环境等。

如图1-4所示。Web UI主要包含以下几部分内容。

图1-4 Web UI左侧功能导航

① 原始环境实时状态

此部分内容可以列举当前所有部署在测试机器集群上的ESX虚拟机,这部分虚拟机全部是原始状态,管理员部署好后添加到系统中。

界面需要展示虚拟机的基本信息,包括系统类型、IE 版本、应用软件列表、虚拟机IP、繁忙或空闲状态、当前霸占用户及剩余时间、霸占入口。

用户可以在此直接霸占满足自己基本需求的原始状态虚拟机。

② 私人快照实时状态

此部分与ESX虚拟机进行分开展示,用户使用ESX虚拟机的过程中需要做快照,快照信息将会自动保存,然后在此展示。方便用户后续从此处找到历史快照,直接霸占使用。

快照展示信息和原始状态虚拟机基本类似,可以增加一项快照备注,方便用户对快照备注管理。

③ 我在用的测试环境

当用户在系统中霸占虚拟机后,在此处显示用户霸占的全部虚拟机或快照列表,方便对自己占用的测试环境进行浏览、快照、及时归还操作。同时用户也可以在此处申请延长某测试环境的霸占时间。

④ 定制虚拟测试环境

当系统管理的测试环境资源很多时,用户不太方便从已有环境列表里逐项浏览查找,因此可以提供定制功能,让用户定制自己需要的环境类型,系统自动从当前所有空闲资源中筛选出符合条件的测试环境,同时还可以自动化协调测试机器的负载均衡。

可以提供以下定制条件:包括各类应用软件列表、系统类型、IE版本、使用时间、是否做快照等。

⑤ 我要补充应用软件

应用软件不计其数,系统也只能提供有限的应用软件列表,这部分肯定不能满足用户的全部需求,因此提供这样一个入口,当用户所需部署的某款软件在列表中找不到时,用户可以自己向系统提供软件名称、下载 URL,系统将会记录该款软件,并且自动下载,然后为用户安装部署到测试环境。

⑥ 后台管理

后台管理主要面向管理员,管理员可以在此向环境管理系统增加、删除测试环境信息。增加删除应用软件信息,为用户做某些特殊授权等操作。

⑦ 使用统计

主要对用户使用测试环境的情况进行统计,方便管理员进行环境使用效率分析,调整测试环境部署等。

⑧ 我的信息

方便注册用户更新自己的个人信息。

以上各项内容可以通过 Web 页面左侧列表树的形式展现给用户,方便用户在各项之间进行切换浏览。

(2)业务逻辑层(PHP)

业务逻辑层主要实现用户从Web UI发起的各项基本操作,核心功能包括浏览、霸占、定制、快照、归还、提交应用软件等,可以通过PHP实现。

图1-5中简要列出了逻辑层其中三个主要PHP文件。

图1-5 业务逻辑层

● forceenv.php——处理用户霸占操作。

● doenv.php——处理用户定制操作。

● commit.php——处理用户提交应用软件操作。

① 虚拟机状态机

业务逻辑层的核心操作主要是处理虚拟机的状态,可以用状态机来维护。

业务逻辑层的核心操作主要处理虚拟机的状态,可以用状态机来维护,如图1-6所示。

图1-6 虚拟机状态图

当虚拟机处于空闲状态时,我们标识其为IDLE状态,此时用户可以直接从页面霸占该虚拟机,或者通过定制由系统自动将该虚拟机分配给用户。

当虚拟机被分配给用户后,系统即开始启动部署测试环境。因为一般部署需要在1~3分钟,所以此时可以标识其为waiting状态,用户暂时不可用,同时也不能被其他用户霸占或定制,属于中间状态。假如遇到异常,虚拟机部署失败,系统应将其重新置回IDLE,如果部署成功,将其设置为using状态。

当虚拟机被设置using状态后,将在页面展示为繁忙状态,此时其他用户不能霸占此虚拟机。当用户使用完毕后,可以主动归还环境,否则达到霸占使用时间后,系统将自动强制回收虚拟机,将其重新置为IDLE状态,供其他用户霸占使用。

② forceenv.php 霸占环境

用户霸占环境时,需要首先根据用户的权限判断用户霸占数量是否已到达上限,如果已到达上限,则直接霸占失败。权限控制对于合理分配利用测试环境资源尤为重要。

如图1-7所示,接下来的处理将分为两个线程。

图1-7 环境霸占流程

第一个线程调用Proxy模块霸占接口,向调度Server发起霸占操作,同时在数据库中将虚拟机状态由IDLE设置为waiting。

第二个线程将定期轮询该虚拟机的实际状态,通过 Proxy 发起查询状态请求,当waiting超时后霸占失败。虚拟机成功部署后,在数据库中将虚拟机设置为using状态,同时将虚拟机远程登录的地址和密码通过邮件发送到用户的注册邮箱。

③ doenv.php定制环境

用户发起定制环境操作后,系统将自动根据定制条件选择符合用户需求的测试环境。环境定制流程如图1-8所示。

图1-8 环境定制流程

若未查询到满足条件的测试环境,则直接定制失败。

若查询到满足条件的测试环境,则开始启动部署测试环境,并在数据库中设置虚拟机状态,流程与霸占相同。

④ 用户提交应用软件

应用软件提交流程如图1-9所示。

图1-9 应用软件提交流程

用户提交应用软件时,需要提供以下数据:选择软件分类,提供软件显示名称、安装包名称(静默安装需要),以及下载地址。

若用户提交信息不完整,则提示用户重新输入。

系统收到用户提交的完整数据后,首先将软件数据插入数据库,同时标识该软件未下载(设置status=0),然后通过Proxy模块启动P2SP下载程序进行下载;另外启动一个线程定期轮询软件是否存在,即p2sp程序是否下载成功,若下载成功,则将其状态设置为已下载(设置status=2),同时页面软件列表中显示其可定制部署。

(3)数据层(MySQL)

数据库可以采用MySQL,根据系统业务需求及逻辑层的设计,设计数据库表结构如下。

① 虚拟机、快照信息数据库表

    CREATE TABLE `vminfo` (
    `id` bigint(20) NOT NULL auto_increment,
    `mip` varchar(64) NOT NULL,             //虚拟机物理IP
    `vmid` varchar(200) NOT NULL,           //虚拟机ID
    `snapid` varchar(200) NOT NULL,         //快照ID
    `system` varchar(64) NOT NULL,          //操作系统类型
    `bit` varchar(8) NOT NULL,              //32位或64位系统
    `status` varchar(8) NOT NULL,           //虚拟机状态
    `usenum` varchar(8) NOT NULL,           //被使用次数
    `createuser` varchar(100),              //创建用户
    `createdate` DATETIME NOT NULL,         //创建日期
    `currentuser` varchar(100) NOT NULL     //当前使用用户
    `softlist` varchar(2048),               //部署的应用软件列表
    `usetime`  bigint(64) NOT NULL,         //霸占时间
    `starttime` bigint(64) NOT NULL,        //霸占开始时间
    `savesnap` bigint(20) NOT NULL,         //归还时是否自动保存快照
    `chose` bigint(20),                     //同一虚拟机的若干快照,标识哪个被实际霸占
    `userip` varchar(64) NOT NULL,          //动态远程登录IP
    `userpass` varchar(64) NOT NULL,        //动态远程登录密码
    `snapcnt` varchar(512),                 //快照备注
     PRIMARY KEY (`id`)
    );

② 用户信息数据库表

    CREATE TABLE `userinfo` (
    `id` bigint(20) NOT NULL auto_increment,
    `username` varchar(100) NOT NULL,       //注册用户名
    `password` varchar(100) NOT NULL,       //注册用户密码
    `email` varchar(100) NOT NULL,          //注册用户邮箱
    `registerdate` DATETIME NOT NULL,       //用户注册日期
    `usetime`  bigint(64) NOT NULL,         //用户累计使用时间
    `userinfo` varchar(100) NOT NULL,       //用户真实身份信息
    PRIMARY KEY (`id`)
    );

③ 应用软件列表信息

    CREATE TABLE `softinfo` (
    `id` bigint(20) NOT NULL auto_increment,
    `classid` bigint(20) NOT NULL,              //应用软件分类ID
    `classname` varchar(200) NOT NULL,          //应用软件分类名称
    `displayname` varchar(300) NOT NULL,        //应用软件显示名称
    `officialurl`  varchar(300) NOT NULL,       //应用软件下载URL,推荐官方下载网址
    `installer` varchar(150) NOT NULL,          //应用软件安装列表名称
    `silentmode` varchar(16) NOT NULL,          //应用软件静默安装方式
    `adduser` varchar(150) NOT NULL,            //提交用户名称
    `status` varchar(150) NOT NULL,             //软件下载状态
    PRIMARY KEY (`id`)
    );

(4)代理及调度Server

Proxy模块主要提供给PHP调用,封装接口如图1-10所示,以上结构能将逻辑实现进行分层,保证逻辑层PHP程序专注处理与用户的交互,底层专注虚拟机的各种控制。

图1-10 代理及调度服务器交互

Proxy模块通过C++实现,在Linux操作系统上形式为二进制程序,PHP直接以命令行形式调用Proxy,由于交互参数较多,可以以配置文件形式传递。具体为:用户发起某项操作,PHP根据操作生成配置文件,然后调用Proxy,告诉Proxy配置文件名称, Proxy解析配置文件,根据各项参数执行指定操作。

PHP与Proxy交互的主要配置文本协议如下。

    #定制测试环境
    Action:doenv                    //定制环境命令
    MachineIp: x.x.x.x              //物理机IP
    Env_Vmid: vmid                  //虚拟机ID
    Env_Snapid: snapid              //快照ID
    Env_Apps_List: applist.txt      //用户定制的应用软件列表


    #霸占测试环境
    Action:forceenv                 //霸占环境命令
    MachineIp: x.x.x.x              //物理机IP
    Env_Vmid: vmid                  //虚拟机ID
    Env_Snapid: snapid              //快照ID
    Env_Snappass: xxx               //快照密码
    Env_Apps_List: applist.txt


    #查询环境定制结果
    Action:queryenv
    MachineIp: x.x.x.x
    Env_Vmid: vimd
    Env_Apps_Result: idle/waiting/using/down  //Proxy返回字段,对于虚拟机的各个状态
    Env_Snapid: snapid
    Env_Userip: x.x.x.x
    Env_UserPass: xxx


    #创建快照
    Action:dosnap
    MachineIp: x.x.x.x
    Env_Vmid: vmid
    Env_Next: using/idle            //using表示仅创建快照,不影响用户继续使用
                                    //IDLE表示创建快照后,关闭虚拟机
    CreateUser: xxx                 //创建快照的用户


    #关闭虚拟机
    Action:closeenv
    MachineIp: x.x.x.x
    Env_Vmid: vmid


    #通知环境信息
    Action: sendmail           //测试环境部署完毕后向用户发送通知邮件,包含测试环境登录信息
    VmIp: x.x.x.x              //测试环境远程登录IP
    VmPass: xxx                //测试环境远程登录密码
    MAIL: xxx@xxxxx.com        //用户注册邮箱
    #需求反馈
    Action: feedback           //将用户反馈的需求,邮件形式发送给管理员
    From: xxx@xxxxx.com        //需求反馈用户
    To: xxx@xxxxx.com          //管理员
    Content: content.txt       //用户反馈内容


    #用户向系统添加应用软件
    Action: addsoft            //Proxy需要启动P2SP下载程序
    softurl: xxx               //应用软件下载URL
    softname: xxx              //应用软件名称,即安装包名称,静默安装使用


    #查询应用软件下载状态
    Action: querysoft          //通过Proxy查询软件是否下载到本地服务器
    softname: xxx              //应用软件名称
    status: yes/no             //Proxy返回填写字段,yes代表下载成功,在本地服务器存在
    // no代表尚未下载成功

调度Server采用C++语言开发,为运行在Linux上的服务,与Proxy交互,处理并响应Proxy发送过来的各项请求。

调度Server封装了ESX虚拟机的基本命令行操作,如启动、关闭、快照、查询状态等。

调度Server接收到Proxy请求后,主要调用以下ESX封装脚本,实现各种操作。主要shell命令如下:

    #虚拟机部署状态
    vmrun -T esx -h https://$2/sdk -u root -p 123456 -gu Administrator -gp 123456
listDirectoryInGuest "[datastore1] $3" "c:" 2>&1|grep result|cut -d. -f2


    #虚拟机是否处在启动状态
    ssh root@$2 $cmdvmsvc/power.getstate  $3 2>&1 | grep "Powered on"


    #虚拟机是否可连接
    vmrun -T esx -h https://$2/sdk -u root -p 123456 list| grep Failed


    #启动虚拟机
        ssh root@$2 $cmdvmsvc/getallvms |awk'{ if ($1 == '"$3"') print $4}'
    vmrun -T esx -h https://$2/sdk -u root -p 123456 start "[datastore1] $vmname"


    #关闭虚拟机
    ssh root@$2 $cmdvmsvc/getallvms |awk'{ if ($1 == '"$3"') print $4}'
    vmrun -T esx -h https://$2/sdk -u root -p 123456 stop "[datastore1] $vmname"
        #获取虚拟机IP
            ssh root@$2 /usr/bin/$cmdvmsvc/get.summary $3 2>&1 | grepipAddress|grep -v
    "unset"|cut -d '"' -f 2


        #远程复制用户定制的应用软件列表到目标虚拟机,静默安装使用
            vmrun -T esx -h https://$2/sdk -u root -p 123456 -gu Administrator -gp 123456
    CopyFileFromHostToGuest  "[datastore1] $3" /var/www/html/proxy/$4 'c:\\vmCenter\\
    applist.txt'`


        #远程复制文件到目标虚拟机
            vmrun -T esx -h https://$2/sdk -u root -p 123456 -gu Administrator -gp $5
    CopyFileFromHostToGuest  "[datastore1]$3"/var/www/html/proxy/$4'c:\\vmCenter\\'$4


        #启动P2SP下载程序,下载用户提交的应用软件
        vmrun -T esx -h https://$2/sdk -u root -p 123456 -gu Administrator -gp 123456
    runProgramInGuest "[datastore1] $3" 'c:\\vmCenter\\install.bat'


        #创建快照
        ssh root@$2 $cmdvmsvc/getallvms |awk'{ if ($1 == '"$3"') print $2}'
              /usr/lib/vmware-vcli/apps/vm/vmsnapshot.pl --url https://$2/sdk/webService
    --username root --password 123456 --vmname $vmname --sname $4 2>&1 |grep completed


        #恢复到某快照状态
        ssh root@$2 $cmdvmsvc/getallvms |awk'{ if ($1 == '"$3"') print $2}'
              /usr/lib/vmware-vcli/apps/vm/snapshotmanager.pl  --url  https://$2/sdk/
    vimService  --username  root  --password  123456  --operation  goto  --vmname  $vmname
    --snapshotname$4 2>&1 |grep successfully


        #删除快照
        /usr/bin/ssh root@$2 $cmdvmsvc/getallvms |/bin/awk'{ if ($1 == '"$3"') print $4}'
        /usr/bin/vmrun  -T  esx  -h  https://$2/sdk  -u  root  -p  123456  deleteSnapshot
    "[datastore1] $vminfo" $4


        #通过vmid获取vm信息
        ssh root@$2 $cmdvmsvc/getallvms |awk '{ if ($1 == '"$3"') print $4}'


        #通过vmid获取vmname
        ssh root@$2 $cmdvmsvc/getallvms |awk'{ if ($1 == '"$3"') print $2}'


        #获取虚拟机状态
        ssh root@$2 $cmdvmsvc/power.getstate $3 2>&1|grep "Powered on"
        #复制应用软件安装程序到目标虚拟机,进行静默安装部署
        copysoftfile)
        vmname=`ssh root@$2 $cmdvmsvc/getallvms |grep "$3 "|awk '{print $4}'`
        result=`vmrun -T esx -h https://$2/sdk -u root -p 123456 -gu Administrator -gp
    123456 CopyFileFromHostToGuest  "[datastore1] $vmname" /var/www/html/logicserver/
    allsoft.txt c:\\\\vmCenter\\\\allsoft.txt`
        ;;
        #到目标虚拟机启动应用软件静默安装
        vmname=`ssh root@$2 $cmdvmsvc/getallvms |grep "$3 "|awk '{print $4}'`
        result=`vmrun -T esx -h https://$2/sdk -u root -p 123456 -gu Administrator -gp
    123456 runProgramInGuest "[datastore1] $vmname" "c:\\\\vmCenter\\\\install_soft.bat"`


        #查询应用软件下载状态
        vmname=`ssh root@$2 $cmdvmsvc/getallvms |grep "$3 "|awk '{print $4}'`
        result=`vmrun -T esx -h https://$2/sdk -u root -p 123456 -gu Administrator -gp
    123456 fileExistsInGuest "[datastore1] $vmname"  "c:\\\\vmCenter\\\\downloads\\\\
    $4"|grep "The file exists."`