Настройка гостевой системы PowerCLI New-VM GuestOS не выполняется, когда сценарий читает файл XML - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть сценарий Powershell (v5.1) (в 32-битном режиме), который я использовал для создания новых виртуальных машин (наша оркестровка vRealize, похоже, не может вести журнал).Я использую PowerCLI v5.5.

Сценарий прекрасно работает, единственная проблема с ним заключается в том, что большая часть данных жестко закодирована в сценарии.Я написал XML-файл, содержащий все переменные данные, которые я хочу выбрать, но когда я добавил код для чтения XML-файла, виртуальные машины не смогли изменить IP-адрес во время OSGuestCustomization (и, по-видимому, затем учетные данные администратора) итаким образом, новая ВМ была для меня довольно бесполезна.

Недоумение, почему добавление этой строки:

$script:CMDBInfo = [xml](gc c:\src\Enterprise\Enterprise\Systems\Scripts\Powershell-SCMDEV\Opsbrain\TMCMDB.xml)

в сценарий может привести к сбою этой строки:

$create_vm = New-VM -Template $script:json_data.opb_template -ResourcePool $script:json_data.opb_build_cluster -Name $script:json_data.host_name -Datastore $datastore -DiskStorageFormat Thin -OSCustomizationSpec $customization -Confirm:$false -RunAsync -ErrorAction Stop$create_vm = New-VM -Template $script:json_data.opb_template -ResourcePool $script:json_data.opb_build_cluster -Name $script:json_data.host_name -Datastore $datastore -DiskStorageFormat Thin -OSCustomizationSpec $customization -Confirm:$false -RunAsync -ErrorAction Stop

Я наконец попытался просто закомментировать GC, и New-VM сработала.

Обнаружился краткий поиск https://communities.vmware.com/thread/482488, и я смонтировал диск на другом сервере, чтобы проверить временные файлы и журналы VMware.

Я вижу некоторые ошибки, но это не таксразу же выясняются их причины.

c:\windows\setupact.log : dispci.dll:  DispCISkipClassInstaller: SetupDiGetSelectedDriver failed with error 0xe0000203.

c: \ windows \ setuperr.log был пуст.

c:\windows\temp\vminst.log : 
2017-09-29 14:06:06| tools-build-3917699| INFO: Failed to fetch component state for '_driver_memctl.5C48FA9C_E001_43CB_B2B6_590CD422177E'.
2017-09-29 14:06:40| inst-build-3917699| E1: FILE: FileDeletionRetry: Non-retriable error encountered (C:\Windows\TEMP\vmware-SYSTEM\00007bf9\windows.iso): The system cannot find the file specified (2)

но похоже, что все закончилось нормально:

2017-09-29 14:06:40| inst-build-3917699| I1: Upgrader finished execution, now signalling event.
2017-09-29 14:06:40| inst-build-3917699| I1: Upgrader: returning [0]

Я удалил много комментариев и «посторонних» данных, чтобы получить репрезентативную выборку файла XML.

<?xml version="1.0" encoding="utf-8"?>
<CMDB>
    <IPTable>
        <Network Name="DevServerPrivate">
            <Range Subnet="192.168.1.0" RangeLow="192.168.1.21" RangeHigh="192.168.1.150" SubnetMask="255.255.255.0" DefGW="192.168.1.1" DNS="8.8.8.8,8.8.4.4" VMwareNetworkLabel="devserver" />
        </Network>
    </IPTable>
</CMDB>

И выдержки из скрипта:

$script:CMDBInfo = [xml](gc D:\src\Enterprise\Enterprise\Systems\Scripts\Powershell-SCMDEV\Opsbrain\TMCMDB.xml)
$TargetNetwork = "$($json_data.environment)ServerPrivate"
$NetworkRanges = $script:CMDBInfo.CMDB.IPTable.Network | Where-Object {$_.Name -eq $TargetNetwork}
# Some ranges may be inactive, meaning we don't want to use them anymore
# Or some ranges may not have any available IP addresses, if multiple ranges are assigned to the environment then we'll want to try all of them to get a valid IP.
foreach($RangeInfo in $NetworkRanges.Range){
    if(-not ($RangeInfo.Active -eq 'false')){
        $IPAddress = GetIPFromIPAM -Subnet $RangeInfo.Subnet
        if([regex]::Matches($IPAddress,'([0-9]{1,3}\.){3}[0-9]').Success -eq 'True'){
            break
        }
    }
}
if([regex]::Matches($IPAddress,'([0-9]{1,3}\.){3}[0-9]').Success -eq 'True'){
    $script:json_data | Add-Member -Type NoteProperty -Name ip_address -Value $IPAddress
    $script:json_data | Add-Member -Type NoteProperty -Name opb_vm_port_group -Value $RangeInfo.VMwareNetworkLabel
    $script:json_data | Add-Member -Type NoteProperty -Name opb_netmask -Value $RangeInfo.SubnetMask
    $script:json_data | Add-Member -Type NoteProperty -Name opb_default_route -Value $RangeInfo.DefGW
    $script:json_data | Add-Member -Type NoteProperty -Name opb_name_server -Value $RangeInfo.DNS
} else {
    LLToLog -EventID $LLERROR -Text "Unable to get an IP address for $TargetNetwork"
    #Exit
}

$script:json_data

После сброса $ script: json_data в конце все данные заполняются идентично жестко закодированным значениям, которые я использовал впредыдущая (рабочая) итерация скрипта.

Затем я использую данные для заполнения объекта OSCustomization:

$customization = Get-OSCustomizationSpec -Name "Spec_$host_name" | Get-OSCustomizationNicMapping | Set-OSCustomizationNicMapping  -IpMode UseStaticIP -IpAddress $script:json_data.ip_address -SubnetMask $script:json_data.opb_netmask -DefaultGateway $script:json_data.opb_default_route -Dns $script:json_data.opb_name_server[0],$script:json_data.opb_name_server[1]
$customization = Get-OSCustomizationSpec -Name "Spec_$host_name" | Set-OSCustomizationSpec -Domain $script:json_data.dns_domain -DomainUsername "service_account@domain.com" -DomainPassword $DomainAdminPwd

И затем создаю виртуальную машину:

$create_vm = New-VM -Template $script:json_data.opb_template -ResourcePool $script:json_data.opb_build_cluster -Name $script:json_data.host_name -Datastore $datastore -DiskStorageFormat Thin -OSCustomizationSpec $customization -Confirm:$false -RunAsync -ErrorAction Stop

Прямо сейчас у меня есть Франкенштейн старого и нового сценария.Я пытаюсь выполнить новый сценарий, извлекая информацию из XML-файла, но затем игнорирую все это и устанавливаю значения json_data в жестко закодированные значения старого сценария.Поэтому независимо от того, читаю я XML или нет, я всегда использую одни и те же значения.

И если я закомментирую чтение XML, OSGuestCustomization завершится примерно через 2 минуты после завершения клона New-VM.Если я оставлю это без комментариев, OSGuestCustomization никогда не завершится.Я думаю, что некоторые компоненты делают это: сервер считает, что он присоединен к домену, но IP-адрес не устанавливается (как сообщается в VMWare Tools), а учетные данные локальной учетной записи администратора не устанавливаются.

...