1

I want to create VM with a job.

cls
if (-not (Get-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue)) {
    Add-PSSnapin VMware.VimAutomation.Core | Out-Null 
}

#import VM settings
$VMs = Import-CSV '...\Install_AIO_automated\Data.csv' -UseCulture

Write-Host "Current connections:"
$Global:DefaultVIServers.count

$ScriptBlocky = {
    Param($VM) 

    Write-Host  "Begin"
    $server += $VM.vs_xstream__vc_host
    $connection = Connect-VIServer $VM.vs_xstream__vc_host -User $VM.vs_xstream__vc_admin -Password $VM.vs_xstream__vc_password
    $connection.SessionId

    Write-Host  $connection.SessionId
    Write-Host  $OSspec

    $OSspec = 'BasicLinuxSpec'

    # Selecting random Cluster for VMs deployment
    Write-Host $VM.Cluster
    Write-Host $VM.vs_xstream__vc_host
    $ClusterHoste = Get-Cluster $VM.Cluster -server $VM.vs_xstream__vc_host | Get-VMHost | Get-Random
    #$ClusterHost = Get-Cluster $VM.Cluster -server $VM.vs_xstream__vc_host | Get-VMHost | Where{$_.ConnectionState -eq "Connected"} | Get-Random
    Write-Host $connection.SessionId
    Write-Host $ClusterHoste

    Write-Host ""
    $domain_name = $VM.FQDN.split('.')
    Write-Host  $domain_name
    # Create new OS Customization Specification template for further usage

    New-OSCustomizationSpec -Name $OSspec -Domain ("{0}.{1}" -f $domain_name[1],$domain_name[2]) -DnsServer $VM.DNS,$VM.DNS2 -NamingScheme VM -OSType Linux -Server $VM.vs_xstream__vc_host
    # Starting VMs customization with previously created specification
    $OSspec

    Write-Host "TRY"
    Get-OSCustomizationSpec $OSspec -Server $VM.vs_xstream__vc_host | Get-OSCustomizationNicMapping | Set-OSCustomizationNicMapping -IpMode UseStaticIp -IpAddress $VM.Ipaddress -SubnetMask $VM.NetMask -DefaultGateway $VM.Gateway 

    Write-Host "VM create:"
    Write-Host $OSspec 
    Write-Host $ClusterHost

    New-Vm -VMhost $ClusterHost -Name $VM.vm_name -Server $VM.vs_xstream__vc_host -Datastore $VM.Datastore -Template $VM.Template -Description $VM.Description -DiskStorageFormat "Thin" -OScustomizationSpec $OSspec

    # Remove Customization Specification template
    Remove-OSCustomizationSpec $OSspec -Server $VM.vs_xstream__vc_host -confirm:$false

    Write-Host "Done"
}

foreach ($VM in $VMs) {
    if ($VM.Use -eq 1) {
        $session = $global:DefaultVIServer | %{ $_.sessionsecret }
        $vcserver = $global:DefaultVIServer.ServiceUri.Host

        $session
        $vcserver
        Write-Host "start script"

        Start-Job -ScriptBlock $ScriptBlocky -ArgumentList $VM

        Write-Host "end script"

        Get-Job | Wait-Job
    }
}

Results:

Current connections:
1

22f81178669d314003bc75206e3ffad384ee2568

10.xx.xx.xx (IP address)

start script


Id     Name            PSJobTypeName   State         HasMoreData     Location     
--     ----            -------------   -----         -----------     --------
46     Job46           BackgroundJob   Running       True            localhost

end script

2      Job2            BackgroundJob   Completed     False           localhost
..

46     Job46           BackgroundJob   Completed     True            localhost

Nothing happens, no VM was created, but if I run this command:

&  $ScriptBlocky -VM $VM 

the VM will be created.

Does anyone see my mistake or what I am doing wrong?

Ansgar Wiechers
  • 193,178
  • 25
  • 254
  • 328
vencrena
  • 65
  • 1
  • 10
  • ok, previously I tried to do same thing with threads and failed, and now doing with jobs. output: start script 20 Job20 BackgroundJob Running True localhost end script but Get_job gives me this. Job20 BackgroundJob Running True localhost looks like script can not do some things. after seeing output with Receive-Job shows this line: New-OSCustomizationSpec –Name $OSspec –Domain "xxxx.local" –DnsServer $VM.DNS,$VM.DNS2 –NamingScheme VM –OSType Linux -Server $VM.vs_xstream__vc_host no errors. have no clue why. – vencrena Feb 29 '16 at 09:36
  • I think problem might be with the sessions... – vencrena Feb 29 '16 at 20:40

2 Answers2

0

this is the code im using to create VMs will my code

$create = New-VM -Name $VM01Name -Template $VM01Template -Location $VM01Folder -VMHost $VM01Host -ResourcePool $VM01Resource -Datastore $VM01DiskDatastore01 -OSCustomizationSpec $VM01OSCustom -RunAsync -Confirm:$false

have a look to see if this will help

SamW
  • 1
  • 1
0

Same as solution in (Thread does not create multiple VMs (session issue)) question.

Solution: * Create all connection to vCenter's before all other actions so connection would be stable. for example:

# Iterate and connect to all vCenters so connections to them will be stable and read only
ForEach($VM in $VMs)
{
   If ($VM.Use -eq 1) 
   {   
      If($server.Contains($VM.vs_xstream__vc_host) -eq $FALSE)
      {   
        $server += $VM.vs_xstream__vc_host
        $AllSessions += Connect-VIServer $VM.vs_xstream__vc_host -User $VM.vs_xstream__vc_admin -Password $VM.vs_xstream__vc_password -NotDefault
        Write-Host "Connected to:  " $VM.vs_xstream__vc_host
      }
   }
}

After all work is done i simply disconnect from all sessions

# Disconnect all created sessions
ForEach($item in $server)
{
   Write-Host ("Disconnecting from {0}...." -f ($item))
   Disconnect-VIServer $item  -Confirm:$false
}

Now script works perfectly and creates VM in different or the same vCenter. if anyone will experience any problems with it let me know.

vencrena
  • 65
  • 1
  • 10