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

来源:互联网 发布:js动态添加class样式 编辑:程序博客网 时间:2024/05/22 16:45


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


脚本如下:

$Cred = New-Object System.Management.Automation.PSCredential("XXXXXXXXX@XXXXXXXXX.partner.onmschina.cn",(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) + "<subscriptions>";}Function BuildSubscriptionsEnd(){    return (BuildLevelSpace 1) + "</subscriptions>";}Function BuildSubscriptionHead($subscriptionName){    return (BuildLevelSpace 2) + "<subscription name='$subscriptionName'>";}Function BuildSubscriptionEnd($subscriptionName){    return (BuildLevelSpace 2) + "</subscription>";}Function BuildVirtualNetworksHead(){    return (BuildLevelSpace 3) + "<virtualnetworks>";}Function BuildVirtualNetworksEnd(){    return (BuildLevelSpace 3) + "</virtualnetworks>";}Function BuildVirtualNetworkHead($name, $address, $location){    return (BuildLevelSpace 4) + "<virtualnetwork Name='$name' AddressSpace='$address' Location='$location'>";}Function BuildVirtualNetworkEnd(){    return (BuildLevelSpace 4) + "</virtualnetwork>";}Function BuildSubnetsHead(){    return (BuildLevelSpace 5) + "<subnets>";}Function BuildSubnetsEnd(){    return (BuildLevelSpace 5) + "</subnets>";}Function BuildSubnetHead($name, $address){    return (BuildLevelSpace 6) + "<subnet Name='$name' AddressRange='$address'>";}Function BuildSubnetEnd(){    return (BuildLevelSpace 6) + "</subnet>";}Function BuildVirtualMachinesHead(){    return (BuildLevelSpace 7) + "<virtualmachines>";}Function BuildVirtualMachinesEnd(){    return (BuildLevelSpace 7) + "</virtualmachines>";}Function BuildVirtualMachine($Name, $OSType, $Size, $IPAddress){    if($IPAddress -ne $NULL)    {        return (BuildLevelSpace 4) + "<virtualmachine Name='$Name' OS='$OSType' Size='$Size' IPAddress='$IPAddress'></virtualmachine>";    } else {        return (BuildLevelSpace 4) + "<virtualmachine Name='$Name' OS='$OSType' Size='$Size'></virtualmachine>";    }}Function ListVNETTopology(){    $subscriptions = Get-AzureSubscription;    WriteToXMLOutput ((BuildLevelSpace 1) + "<?xml version='1.0'?>");    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


脚本输出:

50 0