【问题标题】:Merge Storage Account Name and SKU with VM Name in Powershell在 Powershell 中将存储帐户名称和 SKU 与 VM 名称合并
【发布时间】:2019-07-16 14:20:56
【问题描述】:

我想将 StorageAccountName 及其 SKU 添加到我的报告中,这是我现在拥有的代码:

VMs = Get-AzureRmVM -Status

 $vmOutput = $VMs | ForEach-Object {
 [PSCustomObject]@{
 "VM Name" = $_.name
 "Private IP" =""
 "VM Type" = $_.StorageProfile.osDisk.osType
 "VM Profile" = $_.HardwareProfile.VmSize
 "Environment" = $_.Tags.Environment
 "Application" = $_.Tags.Application
 "Decommission Date" = $_.Tags.Decomission
 "OS Disk Size" = $_.StorageProfile.OsDisk.DiskSizeGB
 "Data Disks Total Size" = ($_.StorageProfile.DataDisks.DiskSizeGB | Measure -Sum).Sum
 "Data Disks Amount" = ($_.StorageProfile.DataDisks | Measure ).Count
 "Managed OS Disk" = ($_.StorageProfile.OSDisk.ManagedDisk | Measure).Count
 "Managed Data Disks" = ($_.StorageProfile.DataDisks.ManagedDisk | Measure).Count
 "Powerstate" = $_.PowerState
 }
 }

 $nics = get-azurermnetworkinterface | where VirtualMachine -NE $null
 $ips =@{}

 foreach($nic in $nics){
 $vm = $VMs | Where-Object -Property id -EQ $nic.VirtualMachine.id
 $prv = $nic.IpConfigurations | select-object -ExpandProperty PrivateIpAddress
 $ips.Add($vm.Name,$prv)
 }

 foreach($vm in $vmOutput)
 {
 if($ips.ContainsKey($vm."VM Name"))
 {
 $vm."Private IP"=$ips[$vm."VM Name"]
 }
 }

 $vmOutput | sort "Environment", "VM Type", "VM Profile", "Application" | export-csv VMReport.csv -delimiter ";" -force -notypeinformation

我尝试用 IP addresses were implemented into this code 更少的方式来做这件事,但它比我预期的要困难得多,因为 Get-AzureRmStorageAccount cmdlet 不像 Get-AzureRMNetworkInterface cmdlet 那样存储 VirtualMachine.Id 属性。

任何想法如何将其合并到一张表中?有什么键可以让我加入这两个信息吗?我想要实现的是将 StorageAccountName 和 SKUName 列添加到 $vmOutput 表中。

更新:

$sat =@{}

$OutFile = "..."

#part1

foreach ($vmdetails in $VMs)
{
$ResourceGroupName=$vmdetails.ResourceGroupName
$VMName=$vmdetails.name
$storage=$vmdetails.StorageProfile.OsDisk.Vhd.Uri
$DataDiks=$vmdetails.StorageProfile.OsDisk.Name
$ss=$storage.split('/')[2]

$OSStorageAccountName=$ss.split('.')[0]
$DiskType="OSDisk"
$StroageAccountLocation=($StroageAccDetail | where  {$_.StorageAccountName -eq $OSStorageAccountName }).location
$StorageAccountType=($StroageAccDetail | where  {$_.StorageAccountName -eq $OSStorageAccountName }).AccountType
"$sub,$ResourceGroupName,$VMName,$DataDiks,$DiskType,$OSStorageAccountName" | Out-File -FilePath $OutFile -Append

$vmdatadisks=$vmdetails.StorageProfile.DataDisks

if($vmdatadisks -ne $null){
foreach($vmDatadsik in $vmdatadisks)
{
$vmDatadsikss=$vmDatadsik.vhd.uri
$DiskType="DataDisk"
$ss=$vmDatadsikss.split('/')[2]
$DataDiks=$vmDatadsik.Name
$dataStorageAccountName=$ss.split('.')[0]
"$sub,$ResourceGroupName,$VMName,$DataDiks,$DiskType,$OSStorageAccountName" | Out-File -FilePath $OutFile -Append
}
}
}

#part2

$VMs = Get-AzureRmVM -ResourceGroupName "..." -Name "..."
$storageAccountName = $VMs.StorageProfile.OsDisk.Vhd.Uri.Split("/")[2].Split(".")[0]
Get-AzureRmStorageAccount -StorageAccountName $storageAccountName -ResourceGroupName "..."

【问题讨论】:

  • 你没有在任何地方打电话给get-azstorageaccount,所以很难理解你到底想做什么
  • 到目前为止,我设法编写了该代码(在第一篇文章中显示为“已更新”):代码的第一部分将存储帐户名称与用于操作系统和数据类型磁盘的 VM 绑定到一个文件中,但这循环不包括 SKUName 遗憾的是它保存到文件而不是变量中,这将是 IMO 更可取的选项。第二部分获取特定 RG 中特定 VM 的存储帐户名称及其 SKUName。我想要实现的是通过 VMs.Name 将 SA 名称和 SKUName 与所有 VM 连接起来,这样我就可以将其添加到主报告中,就像我对私有 IP 地址所做的那样。

标签: azure powershell virtual-machine azure-storage azure-storage-account


【解决方案1】:

如果我误解了你,请纠正我。

假设您引用的 sku 是帐户存储的 sku,您还可以在 $vmOutput 中为 SA 名称和 SKUName 添加占位符。

 $VMs = Get-AzureRmVM -Status  

 $vmOutput = $VMs | ForEach-Object {
 [PSCustomObject]@{
 "VM Name" = $_.name
 "ResourceGroupName" =$_.ResourceGroupName #you must include this parameter
 "storage" = $_.StorageProfile.OsDisk.Vhd.Uri #you must include this parameter
 #your other property
 #add placeholder for SA Name and SKUName like below
 "StorageAccountName" =""
 "StorageAccountSKUName" =""
}
}

然后,遍历$vmoutput中的所有vm,找到相关的storage account和sku,然后给$vmoutput添加value:

foreach($v in $vmOutput){
$resourceGroups = $v.ResourceGroupName
$storage=$v.storage

if($storage -ne $null)
{
$ss=$storage.split('/')[2]
$OSStorageAccountName=$ss.split('.')[0]

$s1 = Get-AzureRmStorageAccount -ResourceGroupName $resourceGroups -StorageAccountName $OSStorageAccountName

#add the value to $vmoutput
$v.StorageAccountName =$OSStorageAccountName
$v.StorageAccountSKUName=$s1.Sku.name
}
else
{
$v.StorageAccountName ="no value"
$v.StorageAccountSKUName="no value"
}
}

【讨论】:

  • 这几乎正是我想要实现的,非常感谢!但它不包括有关高级 SSD 的数据,而仅包括标准 LRS 或 GRS 存储。
  • 我认为这是因为高级存储直接附加到 VM,而不是通过存储帐户,所以我只是将“无价值”更改为高级 SSD。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2016-01-28
相关资源
最近更新 更多