您的位置:首页 > 运维架构 > Shell

[Azure]使用Powershell获取ASM和ARM存储的实际使用量

2017-08-30 17:24 459 查看
在下面两篇的基础上修改了一点脚本,加入了统计Blob实际大小的部分:
http://blog.csdn.net/qwertyupoiuytr/article/details/77527998 http://blog.csdn.net/qwertyupoiuytr/article/details/77527951
针对ASM下存储账号的脚本:

param(
[Parameter(Mandatory = $true)]
[string]$SubscriptionName,

[Parameter(Mandatory = $true)]
[string]$StorageAccountName
)

Function GetBlobBytes($blob)
{
    $blobSizeInBytes = 124 + $blob.Name.Length * 2;
    $metadataEnumerator = $blob.ICloudBlob.Metadata.GetEnumerator();
    while ($metadataEnumerator.MoveNext())
    {
        $blobSizeInBytes += 3 + $metadataEnumerator.Current.Key.Length + $metadataEnumerator.Current.Value.Length;
    }

    if ($blob.BlobType.ToString() -eq "BlockBlob")
    {
        $blobSizeInBytes += 8;
        $blob.ICloudBlob.DownloadBlockList() | ForEach-Object { $blobSizeInBytes += $_.Length + $_.Name.Length; }
    }
    else
    {
        [int64]$rangeSize = 1GB;
        [int64]$start = 0; $pages = "start";
        while ($pages)
        {
            try
            {
                $pages = $blob.ICloudBlob.GetPageRanges($start, $rangeSize);
            }
            catch
            {
                if ($_ -like "*the range specified is invalid*")
                {
                    $pages = $null;
                    break;
                }
                else
                {
                    Write-Error $_;
                }
            }
            $pages | ForEach-Object { $blobSizeInBytes += 12 + $_.EndOffset - $_.StartOffset; }
            $start += $rangeSize;
        }
    }

    return $blobSizeInBytes;
}

Function SummarizeContainer($context, $containerName)
{
Write-Host ("Calculating container {0}" -f $containerName) -ForegroundColor Yellow;
$totalCount = 0;
$totalSize = 0;
$actualSize = 0;
$token = $null;
$tokenStep = 5000;
do
{
$blobs = Get-AzureStorageBlob -Container $containerName -Context $context -ContinuationToken $token -MaxCount $tokenStep;
if($blobs.Length -le 0)
{
break;
}
foreach($blob in $blobs)
{
$totalSize += $blob.Length;
$actualSize += GetBlobBytes $blob;
}
$totalCount += $blobs.Count;
Write-Host ("{0} blobs calculated" -f $totalCount) -ForegroundColor Cyan;
$token = $blobs[$blobs.Count -1].ContinuationToken;
}
while($token -ne $null)

$totalSizeStr = DecorateSizeWithUnit $totalSize;
$actualSizeStr = DecorateSizeWithUnit $actualSize;

return [PSCustomObject]@{ContainerName = $containerName
BlobCount = $totalCount
TotalSize = $totalSizeStr
ActualTotalSize = $actualSizeStr};
}

Function DecorateSizeWithUnit($totalSize)
{
$totalSizeStr = "";
if (($totalSize/1024/1024/1024) -gt 1)
{
$totalSizeStr = "{0:N}GB" -f ($totalSize/1024/1024/1024);
}
elseif (($totalSize/1024/1024) -gt 1)
{
$totalSizeStr = "{0:N}MB" -f ($totalSize/1024/1024);
}
elseif (($totalSize/1024) -gt 1)
{
$totalSizeStr = "{0:N}KB" -f ($totalSize/1024);
}
else
{
$totalSizeStr = "{0:N}Byte" -f $totalSize;
}
return $totalSizeStr;
}

[void](Select-AzureSubscription -SubscriptionName $SubscriptionName);
$storage = Get-AzureStorageAccount -StorageAccountName $StorageAccountName;
$context = $storage.Context;

Write-Host "Collecting containers" -ForegroundColor Yellow;
$containers = Get-AzureStorageContainer -Context $context;

$containerSummary = @();
foreach ($container in $containers)
{
$containerSummary += (SummarizeContainer $context $container.Name);
}

$containerSummary | Select ContainerName, BlobCount, TotalSize, ActualTotalSize;


运行结果:



针对ARM模式下存储账号的脚本:

param(
[Parameter(Mandatory = $true)]
[string]$SubscriptionName,

[Parameter(Mandatory = $true)]
[string]$ResourceGroupName,

[Parameter(Mandatory = $true)]
[string]$StorageAccountName
)

Function GetBlobBytes($blob)
{
    $blobSizeInBytes = 124 + $blob.Name.Length * 2;
    $metadataEnumerator = $blob.ICloudBlob.Metadata.GetEnumerator();
    while ($metadataEnumerator.MoveNext())
    {
        $blobSizeInBytes += 3 + $metadataEnumerator.Current.Key.Length + $metadataEnumerator.Current.Value.Length;
    }

    if ($blob.BlobType.ToString() -eq "BlockBlob")
    {
        $blobSizeInBytes += 8;
        $blob.ICloudBlob.DownloadBlockList() | ForEach-Object { $blobSizeInBytes += $_.Length + $_.Name.Length; }
    }
    else
    {
        [int64]$rangeSize = 1GB;
        [int64]$start = 0; $pages = "start";
        while ($pages)
        {
            try
            {
                $pages = $blob.ICloudBlob.GetPageRanges($start, $rangeSize);
            }
            catch
            {
                if ($_ -like "*the range specified is invalid*")
                {
                    $pages = $null;
                    break;
                }
                else
                {
                    Write-Error $_;
                }
            }
            $pages | ForEach-Object { $blobSizeInBytes += 12 + $_.EndOffset - $_.StartOffset; }
            $start += $rangeSize;
        }
    }

    return $blobSizeInBytes;
}

Function SummarizeContainer($context, $containerName)
{
Write-Host ("Calculating container {0}" -f $containerName) -ForegroundColor Yellow;
$totalCount = 0;
$totalSize = 0;
$actualSize = 0;
$token = $null;
$tokenStep = 5000;
do
{
$blobs = Get-AzureStorageBlob -Container $containerName -Context $context -ContinuationToken $token -MaxCount $tokenStep;
if($blobs.Length -le 0)
{
break;
}
foreach($blob in $blobs)
{
$totalSize += $blob.Length;
$actualSize += GetBlobBytes $blob;
}
$totalCount += $blobs.Count;
Write-Host ("{0} blobs calculated" -f $totalCount) -ForegroundColor Cyan;
$token = $blobs[$blobs.Count -1].ContinuationToken;
}
while($token -ne $null)

$totalSizeStr = DecorateSizeWithUnit $totalSize;
$actualSizeStr = DecorateSizeWithUnit $actualSize;

return [PSCustomObject]@{ContainerName = $containerName
BlobCount = $totalCount
TotalSize = $totalSizeStr
ActualTotalSize = $actualSizeStr};
}

Function DecorateSizeWithUnit($totalSize)
{
$totalSizeStr = "";
if (($totalSize/1024/1024/1024) -gt 1)
{
$totalSizeStr = "{0:N}GB" -f ($totalSize/1024/1024/1024);
}
elseif (($totalSize/1024/1024) -gt 1)
{
$totalSizeStr = "{0:N}MB" -f ($totalSize/1024/1024);
}
elseif (($totalSize/1024) -gt 1)
{
$totalSizeStr = "{0:N}KB" -f ($totalSize/1024);
}
else
{
$totalSizeStr = "{0:N}Byte" -f $totalSize;
}
return $totalSizeStr;
}

[void](Select-AzureRmSubscription -SubscriptionName $SubscriptionName);
$storage = Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName;
$context = $storage.Context;

Write-Host "Collecting containers" -ForegroundColor Yellow;
$containers = Get-AzureStorageContainer -Context $context;

$containerSummary = @();
foreach ($container in $containers)
{
$containerSummary += (SummarizeContainer $context $container.Name);
}

$containerSummary | Select ContainerName, BlobCount, TotalSize, ActualTotalSize;


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息