This guest post is by Steven Kang who blogs at ssbkang.com, where you can find his back catalogue of posts. Find out more about the guest blogger program here.
INTRODUCTION
Recently, I wrote a PowerCLI script to audit which virtual machines are running on vDisks in relationship. With this report, I could correct naming convention of both VMFS volumes and vDisks and find out which VMFS volumes are not in relationship.
In this blog post, I will be going through:
- Products Used
- Script & Explanation
- Sample Output
PRODUCTS
The following products are used for this report:
- PowerCLI 5.5 R2
- IBM SVC 7.1
- PLINK
SCRIPT
In this script, there are 4 inputs required:
- SVC user
- It doesn’t have to be admin as it only queries vDisk & relationship information
- SVC user’s password
- Master site’s IP address
- Auxiliary site’s IP address
I am assuming that you have connected to the vCenter server. Bear in mind that you are connected to only the vCenter server that is the master site, otherwise, it won’t work.
Now, let’s go through how the script works:
- Call-SVC function is made in order to save SVC command output to a variable
- This utilises PLINK to connect to SVC and query based on the command you put
- In this case, it will use “lsvdisk” and “lsrcrelationship”
- Call-SVC function saves
- Relationship list in master site
- vDisk list in master site
- vDisk list in auxiliary site
- Using the relationship list and vDisk list in master site in Step 2
- If master vDisk is in a relationship, it concatenates it to a variable called expression
- In the end, it becomes a regular expression.
- Gathers VMFS volmes by Get-Datastore
- Using the regular expression in step 3 i.e. $expression, it finds and saves the list of virtual machines those are running on vDisks in relationship
- Foreach virtual machine in the list in step 5
- Foreach datastore this virtual machine is using
- Saves name & size of the virtual machine
- Saves name & capacity & UID of this datastore
- If this datastore can be found in the master relationship list, it saves
- Name & state of the relationship
- Name & UID & IOG of the master vDisk
- Name & UID & IOP of the auxiliary vDisk
- Otherwise, put null to above
- Foreach datastore this virtual machine is using
- Once Step 6 foreach loop is finished, save the result and output as a .csv file
Script is attached below.
$result = '' | select VM, "VM Size", VMFS, "VMFS UID", "VMFS Size", "Master vDisk", "Master UID", "Master IOG", "Aux vDisk", "Aux UID", "Aux IOG", Relationship, State
$svc_user = ""
$svc_password = ""
$master_site = ""
$aux_site = ""
## Step1
Function Call-SVC {
param ($command,$server)
echo y | C:\script\PLINK\plink.exe -pw $svc_password "$svc_user@$server" "$command -delim ," > temp.csv
$output = Import-CSV C:\script\powercli\temp.csv
Remove-Item C:\script\powercli\temp.csv
return $output
}
## Step2
$relationship_list = Call-SVC "lsrcrelationship" $master_site
$master_vdisk_list = Call-SVC "lsvdisk" $master_site
$aux_vdisk_list = Call-SVC "lsvdisk" $aux_site
## Step3
$master_vdisk_list | Foreach-Object {
if ($relationship_list.master_vdisk_name -contains $_.Name) {
$expression += "|" + $_.vdisk_UID
}
}
## Step4
$datastore = Get-Datastore -Verbose
## Step5
$vm = Get-VM -Datastore ($datastore | where {$_.ExtensionData.Info.Vmfs.Extent.DiskName -match ($expression -replace "^\|") }) -Verbose | Sort Name
## Step6
$result = foreach ($v in $vm) {
$v.ExtensionData.Datastore.Value | ForEach-Object {
$id = $_ -replace "[Datastore-]"
$vmfs = $datastore | where { ($_.id -replace "[Datastore-]") -eq $id }
$result."VM" = $v.Name
$result."VM Size" = $v.ProvisionedSpaceGB
$result."VMFS" = $vmfs.Name
$result."VMFS Size" = $vmfs.CapacityGB
$result."VMFS UID" = $vmfs.ExtensionData.Info.Vmfs.Extent.DiskName
$master_vdisk = $master_vdisk_list | where {$_."vdisk_UID" -eq ($vmfs.ExtensionData.Info.Vmfs.Extent.DiskName -replace "naa.").ToUpper()}
$relationship = $relationship_list | where {$_.master_vdisk_name -eq $master_vdisk.Name}
if ($relationship) {
$aux_vdisk = $aux_vdisk_list | where {$_.Name -eq $relationship.aux_vdisk_name}
$result."Relationship" = $relationship.Name
$result."Master vDisk" = $master_vdisk.Name
$result."Master UID" = $master_vdisk.vdisk_UID
$result."Master IOG" = $master_vdisk.IO_group_name
$result."Aux vDisk" = $aux_vdisk.Name
$result."Aux UID" = $aux_vdisk.vdisk_UID
$result."Aux IOG" = $aux_vdisk.IO_group_name
$result."State" = $relationship.state
} else {
$result."Relationship" = ''
$result."Master vDisk" = ''
$result."Master UID" = ''
$result."Master IOG" = ''
$result."Aux vDisk" = ''
$result."Aux UID" = ''
$result."Aux IOG" = ''
$result."State" = ''
}
$result | select *
}
}
## Step7
$result | Export-CSV -UseCulture -NoTypeInformation C:\relationship_list.csv
SAMPLE OUTPUT
A sample output is attached.
VM : test_vm_1
VM Size : 150.1084209
VMFS : datastore1
VMFS UID : naa.60050768018180732000000000000ffa
VMFS Size : 511.75
Master vDisk : master vDisk1
Master UID : 60050768018180732000000000000FFA
Master IOG : 0
Aux vDisk : aux vDisk1
Aux UID : 600507680184856CE8000000000005A9
Aux IOG : 0
Relationship : relationship 1
State : consistent_synchronized
VM : test_vm_2
VM Size : 16.12677459
VMFS : datastore2
VMFS UID : naa.60050768018180732000000000000ab8
VMFS Size : 511.75
Master vDisk : master vDisk2
Master UID : 60050768018180732000000000000AB8
Master IOG : 0
Aux vDisk : aux vDisk2
Aux UID : 600507680184856CE8000000000003D9
Aux IOG : 0
Relationship : relationship 2
State : consistent_synchronized
VM : test_vm_3
VM Size : 303.0498998
VMFS : datastore3
VMFS UID : naa.600507680181807320000000000008c0
VMFS Size : 511.75
Master vDisk :
Master UID :
Master IOG :
Aux vDisk :
Aux UID :
Aux IOG :
Relationship :
State :
VM : test_vm_3
VM Size : 303.0498998
VMFS : datastore4
VMFS UID : naa.60050768018180732000000000000c0b
VMFS Size : 1023.75
Master vDisk :
Master UID :
Master IOG :
Aux vDisk :
Aux UID :
Aux IOG :
Relationship :
State :
VM : test_vm_3
VM Size : 303.0498998
VMFS : datastore5
VMFS UID : naa.60050768018180732000000000000c11
VMFS Size : 1023.75
Master vDisk :
Master UID :
Master IOG :
Aux vDisk :
Aux UID :
Aux IOG :
Relationship :
State :
VM : test_vm_3
VM Size : 303.0498998
VMFS : datastore6
VMFS UID : naa.60050768018180732000000000000ca0
VMFS Size : 1023.75
Master vDisk : master vDisk6
Master UID : 60050768018180732000000000000CA0
Master IOG : 1
Aux vDisk : aux vDisk6
Aux UID : 600507680184856CE8000000000003D4
Aux IOG : 0
Relationship : relationship 6
State : consistent_synchronized
VM : test_vm_4
VM Size : 144.0501173
VMFS : datastore7
VMFS UID : naa.60050768018180732000000000000bba
VMFS Size : 1023.75
Master vDisk : master vDisk7
Master UID : 60050768018180732000000000000BBA
Master IOG : 1
Aux vDisk : aux vDisk7
Aux UID : 600507680184856CE8000000000003D1
Aux IOG : 0
Relationship : relationship 7
State : consistent_synchronized
VM : test_vm_4
VM Size : 144.0501173
VMFS : datastore4
VMFS UID : naa.60050768018180732000000000000c0b
VMFS Size : 1023.75
Master vDisk :
Master UID :
Master IOG :
Aux vDisk :
Aux UID :
Aux IOG :
Relationship :
State :
VM : test_vm_4
VM Size : 144.0501173
VMFS : datastore5
VMFS UID : naa.60050768018180732000000000000c11
VMFS Size : 1023.75
Master vDisk :
Master UID :
Master IOG :
Aux vDisk :
Aux UID :
Aux IOG :
Relationship :
State :
VM : test_vm_5
VM Size : 178.0512089
VMFS : datastore7
VMFS UID : naa.60050768018180732000000000000bba
VMFS Size : 1023.75
Master vDisk : master vDisk7
Master UID : 60050768018180732000000000000BBA
Master IOG : 1
Aux vDisk : aux vDisk7
Aux UID : 600507680184856CE8000000000003D1
Aux IOG : 0
Relationship : relationship 7
State : consistent_synchronized
VM : test_vm_5
VM Size : 178.0512089
VMFS : datastore4
VMFS UID : naa.60050768018180732000000000000c0b
VMFS Size : 1023.75
Master vDisk :
Master UID :
Master IOG :
Aux vDisk :
Aux UID :
Aux IOG :
Relationship :
State :
VM : test_vm_5
VM Size : 178.0512089
VMFS : datastore5
VMFS UID : naa.60050768018180732000000000000c11
VMFS Size : 1023.75
Master vDisk :
Master UID :
Master IOG :
Aux vDisk :
Aux UID :
Aux IOG :
Relationship :
State :
In this example, it shows you that:
- test_vm_1 is running on master vDisk1 which is in relationship 1
- test_vm_3 is running on 4 VMFS volumes where only datastore6 is in relationship 6
- Also, test_vm_4 and test_vm_5 have only one VMFS volume which is in relationship
Hope this helps and always welcome to ping me if there is an issue with this script.