[Azure]使用Azure Powershell输出ASM模式下某个账号中所有订阅下的虚拟网络拓扑



该脚本输出ASM模式下某个账号中所有订阅下的网络拓扑结构,包括虚拟网络地址空间,子网范围,子网内的虚拟机的基本信息等。


脚本如下:

$Cred = New-Object System.Management.Automation.PSCredential("[email protected]",(ConvertTo-SecureString "XXXXXXXXX" -AsPlainText -Force));
$AzureRMCred = Get-Credential -Credential $Cred;
Add-AzureAccount -Environment AzureChinaCloud -Credential $AzureRMCred;

Function WriteToXMLOutput($str)
{
    $OutputfilePath = $PSScriptRoot + "\Network_Topology.xml";
    $str | Out-File $OutputfilePath -Append;
}

Function BuildLevelSpace($level)
{
    $levelSpace = "  ";
    $result = "";
    for ($i = 1; $i -lt $level; $i++)
    {
        $result += $levelSpace;
    }
    return $result;
}

Function BuildSubscriptionsHead()
{
    return (BuildLevelSpace 1) + "";
}

Function BuildSubscriptionsEnd()
{
    return (BuildLevelSpace 1) + "";
}

Function BuildSubscriptionHead($subscriptionName)
{
    return (BuildLevelSpace 2) + "";
}

Function BuildSubscriptionEnd($subscriptionName)
{
    return (BuildLevelSpace 2) + "";
}

Function BuildVirtualNetworksHead()
{
    return (BuildLevelSpace 3) + "";
}

Function BuildVirtualNetworksEnd()
{
    return (BuildLevelSpace 3) + "";
}

Function BuildVirtualNetworkHead($name, $address, $location)
{
    return (BuildLevelSpace 4) + "";
}

Function BuildVirtualNetworkEnd()
{
    return (BuildLevelSpace 4) + "";
}

Function BuildSubnetsHead()
{
    return (BuildLevelSpace 5) + "";
}

Function BuildSubnetsEnd()
{
    return (BuildLevelSpace 5) + "";
}

Function BuildSubnetHead($name, $address)
{
    return (BuildLevelSpace 6) + "";
}

Function BuildSubnetEnd()
{
    return (BuildLevelSpace 6) + "";
}

Function BuildVirtualMachinesHead()
{
    return (BuildLevelSpace 7) + "";
}

Function BuildVirtualMachinesEnd()
{
    return (BuildLevelSpace 7) + "";
}

Function BuildVirtualMachine($Name, $OSType, $Size, $IPAddress)
{
    if($IPAddress -ne $NULL)
    {
        return (BuildLevelSpace 4) + "";
    } else {
        return (BuildLevelSpace 4) + "";
    }
}

Function ListVNETTopology()
{
    $subscriptions = Get-AzureSubscription;

    WriteToXMLOutput ((BuildLevelSpace 1) + "");
    WriteToXMLOutput (BuildSubscriptionsHead);

    # loop all the subscriptions
    foreach($subscription in $subscriptions)
    {
        $subscriptionName = $subscription.SubscriptionName;
        Select-AzureSubscription -SubscriptionName $subscriptionName;
        WriteToXMLOutput (BuildSubscriptionHead $subscriptionName);

        # initialize mappings
        $VMDict = @{};            # key:vm.ServiceName#vm.Name      value:@{Name=vm.Name; OSType=vm.VM.OSVirtualHardDisk.OS; Size=vm.VM.RoleSize; IpAddress=$vm.IpAddress}
        $VNET_VM_Map = @{};       # key:VirtualNetworkName#SubnetName     value:vm.ServiceName#vm.Name
        $vms = Get-AzureVM;
        foreach($vm in $vms)
        {
            $VMDict.Add(($vm.ServiceName + "#" + $vm.Name), @{Name=$vm.Name; OSType=$vm.VM.OSVirtualHardDisk.OS; Size=$vm.VM.RoleSize; IpAddress=$vm.IpAddress});
            $key = $vm.VirtualNetworkName + "#" + $vm.VM.ConfigurationSets.SubnetNames;
            if(!$VNET_VM_Map.ContainsKey($key))
            {
                $VNET_VM_Map[$key] = New-Object System.Collections.ArrayList;
            }
            $VNET_VM_Map[$key].Add($vm.ServiceName + "#" + $vm.Name);
        }

        $vnetConfig = Get-AzureVNetConfig;
        $vnetXml = [xml]($vnetConfig.XMLConfiguration);
        $vnets = $vnetXml.NetworkConfiguration.VirtualNetworkConfiguration.VirtualNetworkSites.ChildNodes;
        if($vnets.Count -gt 0)
        {
            WriteToXMLOutput (BuildVirtualNetworksHead);
            foreach($vnet in $vnets)
            {
                $vnetaddress = "";
                foreach($prefix in $vnet.AddressSpace.AddressPrefix)
                {
                    $vnetaddress += $prefix;
                    $vnetaddress += " "
                }
                $vnetaddress.TrimEnd(' ');
                WriteToXMLOutput (BuildVirtualNetworkHead $vnet.name $vnetaddress $vnet.Location);
                $subnets = $vnet.Subnets.ChildNodes;
                if($subnets.Count -gt 0)
                {
                    WriteToXMLOutput (BuildSubnetsHead);
                    foreach($subnet in $subnets)
                    {
                        WriteToXMLOutput (BuildSubnetHead $subnet.Name $subnet.AddressPrefix);
                        $key = $vnet.name + "#" + $subnet.name;
                        if($VNET_VM_Map[$key].Count -gt 0)
                        {
                            WriteToXMLOutput (BuildVirtualMachinesHead);
                            foreach($vmKey in $VNET_VM_Map[$key])
                            {
                                $vmProp = $VMDict[$vmKey];
                                $vmName = $vmProp["Name"];
                                $OSType = $vmProp["OSType"];
                                $size = $vmProp["Size"];
                                $cip = $vmProp["IpAddress"];
                                WriteToXMLOutput (BuildVirtualMachine $vmName $OSType $size $cip);
                            }
                            WriteToXMLOutput (BuildVirtualMachinesEnd);
                        }
                        WriteToXMLOutput (BuildSubnetEnd);
                    }
                    WriteToXMLOutput (BuildSubnetsEnd);
                }
                WriteToXMLOutput (BuildVirtualNetworkEnd);
            }
            WriteToXMLOutput (BuildVirtualNetworksEnd);
        }
        WriteToXMLOutput (BuildSubscriptionEnd);
    }

    WriteToXMLOutput (BuildSubscriptionsEnd);
}

ListVNETTopology


脚本输出:

[Azure]使用Azure Powershell输出ASM模式下某个账号中所有订阅下的虚拟网络拓扑_第1张图片

你可能感兴趣的:(Powershell,Script,Azure)