Выпуск Building PowerCLI Mass OVF Export Tool

Фон

Я создаю сценарий, используя PowerCLI, для массового экспорта OVF с помощью ovftool VMware. Скрипт работает, выполняя следующие функции:

  • С помощью аргументов PowerCLI примите адрес vCenter, схему именования виртуальных машин для экспорта и место экспорта OVF.
  • Подключитесь к экземпляру vCenter
  • Поместите все виртуальные машины, которые следуют указанной схеме именования, в список
  • Просмотрите список и экспортируйте каждую виртуальную машину в ovf, используя ovftool и встроенный путь к виртуальной машине.

Скрипт: VM-to-OVF.ps1

# Take in vCenter address, naming scheme of VMs to be exported, and where the OVFs should be exported

param (

[string]$vcenter = $(throw "

    vCenter address required.`n

    Example:`n

    .\VMs-to-OVF.ps1 -vcenter <192.168.1.200>`n

    .\VMs-to-OVF.ps1 -vcenter <vcenter.test.com>"),

[string]$vmNamingScheme = $(throw "

    VM naming scheme required.`n

    Example:`n

    .\VMs-to-OVF.ps1 -vcenter <vcenterIP/DNS> -vmPath </DATACENTER/vm/`n

    test/> -vmNamingScheme <test-vm-1>`n

    .\VMs-to-OVF.ps1 -vcenter <vcenterIP/DNS> -vmPath </DATACENTER/vm/`n

    test/> -vmNamingScheme <test-vm-*>`n"),

[string]$exportLocation = $(throw "

    Export location required.`n

    Example:`n

    .\VMs-to-OVF.ps1 -vcenter <vcenterIP/DNS> -vmPath </DATACENTER/vm/`n

    test/> -vmNamingScheme <test-vm-1> -exportLocation 192.168.1.100:\`n

    .\VMs-to-OVF.ps1 -vcenter <vcenterIP/DNS> -vmPath </DATACENTER/vm/`n

    test/> -vmNamingScheme <test-vm-*> -exportLocation X:\`n")

)

# Connect to vCenter

Connect-VIServer -Server $vcenter

# $VMs is an array of VM names that will be exported
# $vmNamingScheme gives the VM naming pattern we are looking for

$VMs = $(get-vm -name $vmNamingScheme | select name | format-list | out-string)
$VMs = $VMs.replace("Name : ","")
$VMs = $VMs.replace(" ","")
$VMs = $VMs.split("`n")
$VMs = $VMs|?{$_ -ne $VMs[1]}

# This loop iterates through the $VMs array and performs an OVF export, to the location
# specified in $exportLocation, for each VM name in the array
# $vmPath is comprised of the path to the VM and $VM holds the actual VM name

foreach ($VM in $VMs){
    if ($VMs -ne $null){ 

    # ***THIS SCRIPT ASSUMES THE get-vmfolderpath SCRIPT IS IN THE SAME DIRECTORY AS ITSELF***
    # get the folder path of the VM using the get-vmfolderpath script (this will align with
    # the path in vSphere Folders and Templates view)

    $vmPath = "get-vm -name $VM | .\get-vmfolderpath.ps1"
    &$vmPath

    # ***THIS SCRIPT ASSUMES THE DEFAULT INSTALL PATH FOR THE ovftool PROGRAM
    # run the ovftool command with the proper arguments

    &'C:\Program Files\VMware\VMware OVF Tool\ovftool.exe' vi://$vcenter$vmPath$VM $exportLocation
    }
}

Сопровождающий скрипт: get-vmfolderpath

param(
    [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
    [string]$folderid,
    [switch]$moref
)

$folderparent=get-view $folderid

if ($folderparent.name -ne 'vm'){
    if($moref){
        $path=$folderparent.moref.toString()+'\'+$path
    }
    else{
        $path=$folderparent.name+'\'+$path
    }
    if ($folderparent.parent){
        if($moref){
            get-vmfolderpath $folderparent.parent.tostring() -moref
        }
        else{
            get-vmfolderpath($folderparent.parent.tostring())
        }
    }
}
else {
    if ($moref){
        return (get-view $folderparent.parent).moref.tostring()+"\"+$folderparent.moref.tostring()+"\"+$path
    }
    else {
        return (get-view $folderparent.parent).name.toString()+'\'+$folderparent.name.toString()+'\'+$path
    }
}

ошибки

Команда ovftool, встроенная в каждую итерацию цикла for, будет работать, если вы копируете и вставляете текст в консоль PowerCLI, но не при запуске непосредственно из сценария. Следующие ошибки возникают, когда пользовательская команда ovftool запускается из скрипта:

The term 'get-vm -name VM-NAME | .\get-vmfolderpath.ps1' is not
recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify
that the path is correct and try again.At
C:\Users\username\Desktop\VMs-to-OVF.ps1:85 char:4
+         &$vmPath
+          ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (get-vm -name CA...mfolderpath.p
   s1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Вещи, которые я проверил:

  • Вывод "get-vm -name vm_name | .\ Get-vmfolderpath.ps1", запускаемый непосредственно в консоли PowerCLI, возвращает правильный путь к виртуальной машине.
  • Все переменные выводят ожидаемые значения
  • Если точная команда ovftool, сгенерированная в сценарии, выполняется в консоли PowerCLI, то она будет правильно экспортировать виртуальную машину

1 ответ

Решение

Просто замкну петлю на этом. Я нашел решение своей проблемы. Я предполагаю, что что-то теряется, когда вы манипулируете списком виртуальных машин, возвращаемым командлетом Get-VM. В сценарии VM-to-OVF, если все строки "$VM =" заменены одной строкой ниже, эта информация сохраняется.

$ VMs = get-vm -name $ vmNamingScheme

В цикле for используйте атрибут.Name для передачи каждого отдельного объекта VM в сценарий get-vmfolderpath.

$ vmPath = get-vm -name $ VM.Name |. \ Получить-vmfolderpath.ps1

Другие вопросы по тегам