vsphere api для изменения IP-адреса VirtualMachine

Я новичок в API-интерфейсе vsphere и пытаюсь изменить сетевые настройки виртуальной машины с динамического IP-адреса на статический IP-адрес, но не могу найти этот параметр. Вот код, который у меня есть до сих пор, он подключается к vsphere, находит виртуальную машину и меняет имя виртуальной машины.
Я предполагаю, что в VirtualMachineConfigSpec есть параметр, который также изменит настройки сети, но я могу' т найти его.

VimClient vimClient = new VimClient();
ServiceContent serviceContent = vimClient.Connect("https://[MY ADDRESS]/sdk");
UserSession us = vimClient.Login("[USERNAME]","[PASSWORD]");

ManagedObjectReference _svcRef = new ManagedObjectReference();
_svcRef.Type = "ServiceInstance";
_svcRef.Value = "ServiceInstance";

NameValueCollection filterForVM = new NameValueCollection();
filterForVM.Add("Name","[VIRTUAL MACHINE NAME]");
VirtualMachine vm = (VirtualMachine)vimClient.FindEntityView(typeof(VirtualMachine),null,filterForVM,null);
VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();

vmConfigSpec.Name = "[NEW NAME]"; // change the VM name
vmConfigSpec.???? // how to set the ip address

vm.ReconfigVM_Task(vmConfigSpec);

vimClient.Disconnect();

person Rossini    schedule 26.06.2013    source источник


Ответы (1)


В VMware API нет настройки для установки IP-адреса в гостевой ОС виртуальной машины, поскольку настройка IP-адреса зависит от версии гостевой ОС. Вы можете использовать два способа сделать это:

1) Вы можете использовать GuestOperationsManager из VMware vSphere API для запуска скрипта настройки IP-адреса на гостевой ОС.

Предпосылки:

  • Вы должны написать скрипты настройки IP-адреса для каждой поддерживаемой ОС (Linux, Windows и т.д.)
  • Инструменты VMware должны быть установлены на каждой поддерживаемой виртуальной машине (для использования GuestOperationsManager).

Update2. Следующий упрощенный пример запуска скрипта в гостевой ОС. Этот пример не включает обработку ошибок, получение логов скрипта, включение ВМ и т. д.

using System;
using System.IO;
using System.Net;
using Vim25Api;

namespace RunScriptOnGuestOsTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var program = new Program();
            program.RunScriptInGuestOs(
                "https://10.1.1.10/sdk",
                "root",
                "vmware",
                "c:\\temp\\test.bat",
                "vm-73",
                "Administrator",
                "P@ssword",
                "c:\\test.bat",
                String.Empty);
        }

        public void RunScriptInGuestOs(string vCenterUrl, string vCenterUserName, string vCenterPassword, string scriptFilePatch, string vmKey, string username, string password, string destinationFilePath, string arguments)
        {
            var service = CreateVimService(vCenterUrl, 600000, true);
            var serviceContent = RetrieveServiceContent(service);
            service.Login(serviceContent.sessionManager, vCenterUserName, vCenterPassword, null);

            byte[] dataFile;
            using (var fileStream = new FileStream(scriptFilePatch, FileMode.Open, FileAccess.Read))
            {
                dataFile = new byte[fileStream.Length];
                fileStream.Read(dataFile, 0, dataFile.Length);
            }

            FileTransferToGuest(service, vmKey, username, password, destinationFilePath, dataFile);
            RunProgramInGuest(service, vmKey, username, password, destinationFilePath, arguments);
        }

        private static VimService CreateVimService(string url, int serviceTimeout, bool trustAllCertificates)
        {
            ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
            return new VimService
            {
                Url = url,
                Timeout = serviceTimeout,
                CookieContainer = new CookieContainer()
            };
        }

        private ServiceContent RetrieveServiceContent(VimService service)
        {
            var serviceInstance = new ManagedObjectReference
            {
                type = "ServiceInstance",
                Value = "ServiceInstance"
            };

            var content = service.RetrieveServiceContent(serviceInstance);
            if (content.sessionManager == null)
            {
                throw new ApplicationException("Session manager is null.");
            }

            return content;
        }

        private void FileTransferToGuest(VimService service, string vmKey, string username, string password, string fileName, byte[] fileData)
        {
            var auth = new NamePasswordAuthentication { username = username, password = password, interactiveSession = false };
            var vmRef = new ManagedObjectReference { type = "VirtualMachine", Value = vmKey };
            var fileMgr = new ManagedObjectReference { type = "GuestFileManager", Value = "guestOperationsFileManager" };
            var posixFileAttributes = new GuestPosixFileAttributes();
            posixFileAttributes.ownerId = 1;
            posixFileAttributes.groupId = 1;
            posixFileAttributes.permissions = (long)0777; //execution file

            var requestUrl = service.InitiateFileTransferToGuest(fileMgr, vmRef, auth, fileName, posixFileAttributes, fileData.Length, true);

            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);
            request.ContentType = "application/octet-stream";
            request.Method = "PUT";
            request.ContentLength = fileData.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileData, 0, fileData.Length);
            requestStream.Close();

            request.GetResponse();
        }

        private void RunProgramInGuest(VimService service, string vmKey, string username, string password, string programPath, string arguments)
        {
            var auth = new NamePasswordAuthentication { username = username, password = password, interactiveSession = false };
            var vmRef = new ManagedObjectReference { type = "VirtualMachine", Value = vmKey };
            var progSpec = new GuestProgramSpec { programPath = programPath, arguments = arguments };
            var processMgr = new ManagedObjectReference { type = "GuestProcessManager", Value = "guestOperationsProcessManager" };
            var result = service.StartProgramInGuest(processMgr, vmRef, auth, progSpec);
        }
    }
}

2) Вы можете использовать DHCP-сервер для управления распределением IP-адресов. Используя VMware API, вы можете получить MAC-адрес виртуальной машины. Далее необходимо настроить DHCP-сервер для распределения желаемых IP-адресов по полученным MAC-адресам.

Предпосылки:

  • Каждая виртуальная машина должна быть настроена на получение IP-адреса от DHCP-сервера.
  • DHCP-сервер, который можно настроить в соответствии с вашими потребностями.
person Mikhail Shcherbakov    schedule 01.07.2013
comment
Мне нужно иметь возможность установить статический IP-адрес на виртуальной машине. В моей среде есть только серверы Windows 2008 R2, поэтому мне нужен только 1 скрипт для установки IP-адреса. У меня нет проблем с написанием скрипта для смены IP-адреса, но я не знаю, как его запустить. - person Rossini; 02.07.2013
comment
Какой язык программирования вы используете? Я реализовал эту функцию на C#, но этот код слишком длинный, чтобы цитировать его здесь полностью. Если вы используете язык сценариев, см. эти статьи virtuallyghetto.com/2011. /07/, vmware.com/files/pdf/techpaper/ . В этих статьях описывается использование PowerCLI для вызова скриптов в гостевой операционной системе и содержится пример на Perl, реализующий операции с гостевой ОС. - person Mikhail Shcherbakov; 02.07.2013
comment
Я использую C #, не могли бы вы написать мне пример в личном сообщении? - person Rossini; 02.07.2013
comment
Я добавил упрощенный пример в свой ответ. - person Mikhail Shcherbakov; 03.07.2013
comment
в вашем примере, где вы получаете класс VimService? - person Rossini; 08.07.2013