vSphere 开发指南3——VMware PowerCLI

发布于 2024-11-01 00:54:10 字数 7564 浏览 3 评论 0

0x00 前言

在之前的文章《vSphere 开发指南 1——vSphere Automation API》和《vSphere 开发指南 2——vSphere Web Services API》分别介绍了通过 vSphere Automation API 和 vSphere Web Services API 实现 vCenter Server 同虚拟机交互的方法,本文将要介绍通过 PowerCLI 实现 vCenter Server 同虚拟机交互的方法

0x01 简介

本文将要介绍以下内容:

  • PowerCLI 的安装配置
  • PowerCLI 命令
  • C Sharp 调用 PowerCLI 的方法

0x02 PowerCLI 的安装配置

PowerCLI 是用于管理 VMware 基础架构的 PowerShell 模块的集合,之前被称作 VI Toolkit (for Windows)

官方文档:https://developer.vmware.com/powercli

1.PowerCLI 的安装

(1) 在线安装

PowerShell 版本最低需要满足 PowerShell 5.0

安装命令:

Install-Module -Name VMware.PowerCLI

(2) 离线安装

下载 PowerCLI 的 Zip 文件,地址如下:https://code.vmware.com/doc/preview?id=13693

获得 PowerShell Modules 的路径,Powershell 命令如下:

$env:PSModulePath

默认可用的一个位置: C:\Program Files\WindowsPowerShell\Modules

将 PowerCLI 的 Zip 文件解压至该目录

解锁文件:

cd C:\Program Files\WindowsPowerShell\Modules
Get-ChildItem * -Recurse | Unblock-File

确认是否安装成功:

Get-Module -Name VMware.PowerCLI -ListAvailable

2.PowerCLI 的使用

支持命令的说明文档:https://developer.vmware.com/docs/powercli/latest/products/vmwarevsphereandvsan/

首先调用 Connect-VIServer 连接至 vCenter,接下来对虚拟机进行管理,最后需要调用 Disconnect-VIServer 断开连接

参照说明文档,同样实现以下功能:

  • 读取虚拟机的配置
  • 查看虚拟机文件
  • 删除虚拟机文件
  • 向虚拟机上传文件
  • 从虚拟机下载文件
  • 在虚拟机中执行命令

具体对应的命令示例如下:

(1) 读取虚拟机的配置

Connect-VIServer -Server 192.168.1.1 -Protocol https -User admin -Password pass1 -Force
Get-VM
Disconnect-VIServer -Server 192.168.1.1 -Force -Confirm:$false

(2) 查看虚拟机文件

可通过在虚拟机中执行命令实现

(3) 删除虚拟机文件

可通过在虚拟机中执行命令实现

(4) 向虚拟机的上传文件

Connect-VIServer -Server 192.168.1.1 -Protocol https -User admin -Password pass1 -Force
Copy-VMGuestFile -Source c:\text.txt -Destination c:\temp\ -VM VM -LocalToGuest  -GuestUser user -GuestPassword pass2
Disconnect-VIServer -Server 192.168.1.1 -Force -Confirm:$false

(5) 从虚拟机下载文件

Connect-VIServer -Server 192.168.1.1 -Protocol https -User admin -Password pass1 -Force
Copy-VMGuestFile -Source c:\text.txt -Destination c:\temp\ -VM VM -GuestToLocal -GuestUser user -GuestPassword pass2
Disconnect-VIServer -Server 192.168.1.1 -Force -Confirm:$false

(6) 在虚拟机中执行命令

虚拟机系统为 Windows:

Connect-VIServer -Server 192.168.1.1 -Protocol https -User admin -Password pass1 -Force
Invoke-VMScript -VM VM -ScriptText "dir" -GuestUser administrator -GuestPassword pass2
Disconnect-VIServer -Server 192.168.1.1 -Force -Confirm:$false

虚拟机系统为 Linux:

Connect-VIServer -Server 192.168.1.1 -Protocol https -User admin -Password pass1 -Force
Invoke-VMScript -VM VM2 -ScriptText "pwd" -GuestUser root -GuestPassword pass2
Disconnect-VIServer -Server 192.168.1.1 -Force -Confirm:$false

注:

实现以上功能不需要完整的 PowerCLI,我们可以仅在 C:\Program Files\WindowsPowerShell\Modules 中保留以下文件夹:

  • VMware.PowerCLI
  • VMware.Vim
  • VMware.VimAutomation.Cis.Core
  • VMware.VimAutomation.Common
  • VMware.VimAutomation.Core
  • VMware.VimAutomation.Sdk

0x03 C Sharp 调用 PowerCLI 的方法

可供参考的示例代码:https://github.com/vmspot/vcenter-inventory

代码引用了 PowerCLI 中的 dll,实现了通过 vCenter Server 对虚拟机资源的访问,是一个界面程序

在实际使用过程中,代码需要做以下修改:

(1) 禁用证书认证

添加代码:

using System.net;
System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

(2) 避免错误

错误内容:

Error: An error occurred while making the HTTP request to https://<ip>/. This could be due to the fact that the server certificate is not configuredproperly with HTTP.SYS in the HTTPS case. This could also be caused by a mismatch of the security binding between the client and the server.

解决方法:

添加代码:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

最终的命令行实现代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using VMware.Vim;
using System.Collections.Specialized;

namespace ConsoleApplication28
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

            string host = "192.168.1.1";
            string username = "administrator@vsphere.local";
            string password = "Password123";

            //Create a new VIM client object that will be used to connect to vCenter's SDK service
            VimClient Client = new VimClientImpl();
            Client.Connect("https://" + host + "/sdk");
            Client.Login(username, password);

            // Get a list of Windows VM's
            NameValueCollection filter = new NameValueCollection();
            filter.Add("Config.GuestFullName", "Windows");

            List<EntityViewBase> vmlist = new List<EntityViewBase>();
            vmlist = Client.FindEntityViews(typeof(VirtualMachine), null, filter, null);

            //Populate the VM names into the VM ListBox
            foreach (VirtualMachine vm in vmlist)
            {
                Console.WriteLine(" -  vm:" + vm.Name);
                Console.WriteLine("    HostName:" + vm.Guest.HostName);
                Console.WriteLine("    IpAddress:" + vm.Guest.IpAddress);
                Console.WriteLine("    GuestState:" + vm.Guest.GuestState);              
            }

            //Get a list of ESXi hosts
            List<EntityViewBase> hostlist = new List<EntityViewBase>();
            hostlist = Client.FindEntityViews(typeof(HostSystem), null, null, null);

            //Populate the Host names into the Host ListBox
            foreach (HostSystem vmhost in hostlist)
            {                
                Console.WriteLine(vmhost.Name);
            }

        }
    }
}

在编译程序前,需要引用以下 4 个 dll:

  • VimService.dll,位于 C:\Program Files\WindowsPowerShell\Modules\VMware.Vim\net45
  • VMware.Binding.Wcf.dll,位于 C:\Program Files\WindowsPowerShell\Modules\VMware.Vim\net45
  • VMware.Binding.WsTrust.dll,位于 C:\Program Files\WindowsPowerShell\Modules\VMware.VimAutomation.Common\net45
  • VMware.Vim.dll,位于 C:\Program Files\WindowsPowerShell\Modules\VMware.Vim\net45

0x04 小结

本文介绍了通过 PowerCLI 实现 vCenter Server 同虚拟机交互的方法,相比于 vSphere Automation API 和 vSphere Web Services API,使用 PowerCLI 更加方便,仅需要引入 PowerCLI 后,通过简单的命令就能够实现同虚拟机的交互。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

她比我温柔

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

xu362930323

文章 0 评论 0

缱倦旧时光

文章 0 评论 0

qq_eXruk9

文章 0 评论 0

遂心如意

文章 0 评论 0

guojiayue1

文章 0 评论 0

愿与i

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文