VMware Cloud Community
ganapa2000
Hot Shot
Hot Shot
Jump to solution

Unable to add SCSI Controllers

Hi,

I am having trouble adding multiple SCSI controllers to VM, using the below script, it adds just one controller and exits. But in .csv file I have mentioned multiple SCSI controllers that needs to added.

Please help

CSV File Contents

"LUN_ID","SCSI_Control","SCSI_ID","Capacity_GB"

"2","SCSI controller 1","0","1"

"0","SCSI controller 2","0","100"

"152","SCSI controller 3","0","500"

#Script

$csvpath = '.\controllers.csv'

foreach ($vmdk in (Import-CSV -Path $csvpath -UseCulture))

{

$vmName = Read-Host -Prompt "Name of the VM"

$vm = Get-VM -Name $vmName

# Does the SCSI Controller exist?

$controller = Get-ScsiController -Name $vmdk.SCSI_Control -VM $vm -ErrorAction SilentlyContinue

   while (-not $controller)

   {

$newBusNumber = ($vm.ExtensionData.Config.Hardware.Device |

    where{$_ -is [VMware.Vim.VirtualSCSIController]} |

    Select -ExpandProperty BusNumber |

    Measure-Object -Maximum |

    Select -ExpandProperty Maximum) + 1

$spec = New-Object VMware.Vim.VirtualMachineConfigSpec

$device = New-Object VMware.Vim.VirtualDeviceConfigSpec

$device.Operation = [VMware.Vim.VirtualDeviceConfigSpecOperation]::add

$device.Device = New-Object VMware.Vim.VirtualLsiLogicSASController

$device.Device.BusNumber = $newBusNumber

$device.Device.SharedBus = [VMware.Vim.VirtualSCSISharing]::PhysicalSharing

$spec.DeviceChange += $device

$vm.ExtensionData.ReconfigVM($spec)

$controller = Get-ScsiController -VM $vm -Name $vmdk.SCSI_Control

exit

   }

}

Reply
0 Kudos
1 Solution

Accepted Solutions
LucD
Leadership
Leadership
Jump to solution

Try like this

#Script

$csvpath = '.\controllers.csv'


$vmName = Read-Host -Prompt "Name of the VM"

$vm = Get-VM -Name $vmName

foreach ($vmdk in (Import-CSV -Path $csvpath -UseCulture))

{

   # Does the SCSI Controller exist?

   $controller = Get-ScsiController -Name $vmdk.SCSI_Control -VM $vm -ErrorAction SilentlyContinue

   if (-not $controller)

   {

   $newBusNumber = ($vm.ExtensionData.Config.Hardware.Device |

   where { $_ -is [VMware.Vim.VirtualSCSIController] } |

  Select -ExpandProperty BusNumber |

   Measure-Object -Maximum |

  Select -ExpandProperty Maximum) + 1

   $spec = New-Object VMware.Vim.VirtualMachineConfigSpec

   $device = New-Object VMware.Vim.VirtualDeviceConfigSpec

   $device.Operation = [VMware.Vim.VirtualDeviceConfigSpecOperation]::add

   $device.Device = New-Object VMware.Vim.VirtualLsiLogicSASController

   $device.Device.BusNumber = $newBusNumber

   $device.Device.SharedBus = [VMware.Vim.VirtualSCSISharing]::PhysicalSharing

   $spec.DeviceChange += $device

   Write-Host "Adding SCSI $($vmdk.SCSI_Control) Bus $($newBusNumber)"

   $vm.ExtensionData.ReconfigVM($spec)

   $vm.ExtensionData.UpdateViewData()

   }

}


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

Reply
0 Kudos
6 Replies
LucD
Leadership
Leadership
Jump to solution

Leave out the exit statement.

Also not sure why you are using a While construct, this should work with a simple If.

#Script

$csvpath = '.\controllers.csv'

foreach ($vmdk in (Import-CSV -Path $csvpath -UseCulture))

{

   $vmName = Read-Host -Prompt "Name of the VM"

   $vm = Get-VM -Name $vmName

   # Does the SCSI Controller exist?

   $controller = Get-ScsiController -Name $vmdk.SCSI_Control -VM $vm -ErrorAction SilentlyContinue

   if (-not $controller)

   {

   $newBusNumber = ($vm.ExtensionData.Config.Hardware.Device |

   where { $_ -is [VMware.Vim.VirtualSCSIController] } |

  Select -ExpandProperty BusNumber |

   Measure-Object -Maximum |

  Select -ExpandProperty Maximum) + 1

   $spec = New-Object VMware.Vim.VirtualMachineConfigSpec

   $device = New-Object VMware.Vim.VirtualDeviceConfigSpec

   $device.Operation = [VMware.Vim.VirtualDeviceConfigSpecOperation]::add

   $device.Device = New-Object VMware.Vim.VirtualLsiLogicSASController

   $device.Device.BusNumber = $newBusNumber

   $device.Device.SharedBus = [VMware.Vim.VirtualSCSISharing]::PhysicalSharing

   $spec.DeviceChange += $device

   $vm.ExtensionData.ReconfigVM($spec)

   $controller = Get-ScsiController -VM $vm -Name $vmdk.SCSI_Control

   }

}


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Reply
0 Kudos
ganapa2000
Hot Shot
Hot Shot
Jump to solution

LucD,

This Script adds just one next available SCSI Controller and loops again asking for VM name, but it is not checking from the input.csv file which are SCSI controllers that needs to be added.

For Example, from the below csv file, I have 3 different controllers needs to be validated and to be added to same VM, like, SCSI Controller 1, 3 and 5

CSV File Contents

"LUN_ID","SCSI_Controller","SCSI_ID","Capacity_GB"

"2","SCSI controller 1","0","1"

"0","SCSI controller 3","0","100"

"152","SCSI controller 5","0","500"

Reply
0 Kudos
LucD
Leadership
Leadership
Jump to solution

Try like this

#Script

$csvpath = '.\controllers.csv'


$vmName = Read-Host -Prompt "Name of the VM"

$vm = Get-VM -Name $vmName

foreach ($vmdk in (Import-CSV -Path $csvpath -UseCulture))

{

   # Does the SCSI Controller exist?

   $controller = Get-ScsiController -Name $vmdk.SCSI_Control -VM $vm -ErrorAction SilentlyContinue

   if (-not $controller)

   {

   $newBusNumber = ($vm.ExtensionData.Config.Hardware.Device |

   where { $_ -is [VMware.Vim.VirtualSCSIController] } |

  Select -ExpandProperty BusNumber |

   Measure-Object -Maximum |

  Select -ExpandProperty Maximum) + 1

   $spec = New-Object VMware.Vim.VirtualMachineConfigSpec

   $device = New-Object VMware.Vim.VirtualDeviceConfigSpec

   $device.Operation = [VMware.Vim.VirtualDeviceConfigSpecOperation]::add

   $device.Device = New-Object VMware.Vim.VirtualLsiLogicSASController

   $device.Device.BusNumber = $newBusNumber

   $device.Device.SharedBus = [VMware.Vim.VirtualSCSISharing]::PhysicalSharing

   $spec.DeviceChange += $device

   Write-Host "Adding SCSI $($vmdk.SCSI_Control) Bus $($newBusNumber)"

   $vm.ExtensionData.ReconfigVM($spec)

   $vm.ExtensionData.UpdateViewData()

   }

}


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Reply
0 Kudos
ganapa2000
Hot Shot
Hot Shot
Jump to solution

LucD,

From the csv file, I have provided SCSI Controller 1, 2 and 5

From CLI, I see as below

pastedImage_0.png

From GUI, I see SCSI Controllers added as 1, 2 and 3, instead of 5

pastedImage_1.png

Reply
0 Kudos
LucD
Leadership
Leadership
Jump to solution

That is how vSphere works I'm afraid.
It assigns the numbers in the Label sequentially, you can't leave gaps.


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Reply
0 Kudos
ganapa2000
Hot Shot
Hot Shot
Jump to solution

Thanks for the update and help LucD.

I think, I am good now, let me go with sequential then... Smiley Happy

Reply
0 Kudos