前面通過Json的Template在Azure上建立了Cisco的CSR路由器。但那個Json的template只支援1塊網路卡。如果需要多網路卡的Cisco CSR路由器,可以改上篇文章中提到的Json Template檔案,也可以用Powershell的指令碼建立。
本文將介紹如何用Powershell建立多Interface的Cisco CSR路由器。
一、確定Cisco CSR Image的位置
和上篇文章相同,Cisco CSR Image的連結如下,我把這個檔案public出來了,大家可以直接下載:
https://ciscorouter.blob.core.chinacloudapi.cn/image/CSR_3_16_4aS_CCO.vhd
二、編寫Powershell指令碼,建立2網路卡的Cisco CSR路由器
function new-ciscocsr{ param( #The VM resource group [Parameter(Mandatory=$true)] [String]$rgname, #The VM name [Parameter(Mandatory=$true)] [String]$vmname, #The High Avalibility Set name [Parameter(Mandatory=$true)] [String]$hasetname, #The new VM IP name [Parameter(Mandatory=$true)] [String]$vmpipname, #The Vnet Name [Parameter(Mandatory=$true)] [String]$vnetname, #The Subnet1 Name [Parameter(Mandatory=$true)] [String]$subnetname1, #The Subnet2 Name [Parameter(Mandatory=$true)] [String]$subnetname2, #The new VM size [Parameter(Mandatory=$true)] [String]$vmsize, #The new user [Parameter(Mandatory=$true)] [String]$newuser, #The new password [Parameter(Mandatory=$true)] [String]$newpwd, #The Image URL [Parameter(Mandatory=$true)] [String]$ImageURL ) #Get a random text as the random text $hash = $null for ($i = 0; $i -le 4; $i++){ $j = (97..122) | Get-Random -Count 1 | % {[char]$_} $hash = $hash + $j } for ($i = 0; $i -le 4; $i++){ $j = (48..57) | Get-Random -Count 1 | % {[char]$_} $hash = $hash + $j } #check the Resource Group, if not exist, create $rgs = Get-AzureRmResourceGroup -Location "China East" $rgrslt = $false foreach ($rg in $rgs){if($rg.ResourceGroupName -eq $rgname){$rgrslt = $true;break}} if(-not $rgrslt) {$rg = New-AzureRmResourceGroup -Name $rgname -Location "China East"} #check the High Avalibility Set, if not exist, create foreach ($rgh in $rgs){ $haset = Get-AzureRmAvailabilitySet -ResourceGroupName $rgh.ResourceGroupName -Name $hasetname -ErrorAction Ignore; if($haset.name -match $hasetname){ if($haset.ResourceGroupName -match $rgname){break;} else{write-host "Please change another haset name";exit;} } } if(-not $haset.Name) {$haset = new-AzureRmAvailabilitySet -ResourceGroupName $rgname -Name $hasetname -Location $rg.Location} #check the Vnet, if not exist, create $vnets = Get-AzureRmVirtualNetwork $vnetrslt = $false foreach ($vnet in $vnets){if($vnet.Name -eq $vnetname){$vnetrslt = $true;break}} if(-not $vnetrslt) { $vnet = New-AzureRmVirtualNetwork -Name $vnetname -AddressPrefix 172.16.0.0/16 -ResourceGroupName $rgname -Location $rg.Location; $subnet1 = add-AzureRmVirtualNetworkSubnetConfig -Name $subnetname1 -AddressPrefix 172.16.1.0/24 -VirtualNetwork $vnet; $subnet2 = add-AzureRmVirtualNetworkSubnetConfig -Name $subnetname2 -AddressPrefix 172.16.2.0/24 -VirtualNetwork $vnet; $vnet = Set-AzureRmVirtualNetwork -VirtualNetwork $vnet } #check the PIP address, if not exist, create $vmpipname01 = $vmpipname + "01" $vmpipname02 = $vmpipname + "02" $pip01rslt = Test-AzureRmDnsAvailability -DomainNameLabel $vmpipname01 -Location $rg.location $pip02rslt = Test-AzureRmDnsAvailability -DomainNameLabel $vmpipname01 -Location $rg.location if(-not $pip01rslt){$vmpipname01 = $hash + $vmpipname01} $pip01 = New-AzureRmPublicIpAddress -Name $vmpipname01 -AllocationMethod Dynamic -DomainNameLabel $vmpipname01 -ResourceGroupName $rgname -Location $rg.Location if(-not $pip02rslt){$vmpipname02 = $hash + $vmpipname02} $pip02 = New-AzureRmPublicIpAddress -Name $vmpipname02 -AllocationMethod Dynamic -DomainNameLabel $vmpipname02 -ResourceGroupName $rgname -Location $rg.Location #check the NIC, if not exist, create $nics = Get-AzureRmNetworkInterface $nic01rslt = $false $nic02rslt = $false $nic01name = $vmname + "01" $nic02name = $vmname + "02" foreach($nic in $nics){if($nic.name -eq $nic01name){$nic01rslt = $true;break}} if($nic01rslt){$nic01name = $hash+$nic01name}else{$nic01name = $nic01name} $nic01 = New-AzureRmNetworkInterface -Name $nic01name -ResourceGroupName $rgname -Location $rg.Location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip01.Id foreach($nic in $nics){if($nic.name -eq $nic02name){$nic02rslt = $true;break}} if($nic02rslt){$nic02name = $hash+$nic02name}else{$nic02name = $nic02name} $nic02 = New-AzureRmNetworkInterface -Name $nic02name -ResourceGroupName $rgname -Location $rg.Location -SubnetId $vnet.Subnets[1].Id -PublicIpAddressId $pip02.Id #user login information $pwd=ConvertTo-SecureString $newpwd -AsPlainText -Force $newvmcred=New-Object System.Management.Automation.PSCredential($newuser,$pwd) #OSDiskName $vmosname = $vmname+$hash+"osdisk" #OSDisk storage url $urls = $ImageURL.Split('/') $saedpnt=$urls[2].Split('.') $saname = $saedpnt[0] $sa = Get-AzureRmStorageAccount -ResourceGroupName $rgname -Name $saname $osDiskUrl = '{0}vhds/{1}-{2}.vhd' -f $sa.PrimaryEndpoints.Blob.ToString(), "vm",$vmosname #create the VM $vm = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize -AvailabilitySetId $haset.Id $vm = Set-AzureRmVMOperatingSystem -VM $vm -Linux -ComputerName $vmname -Credential $newvmcred $vm = Add-AzureRmVMNetworkInterface -VM $vm -Primary -Id $nic01.Id $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic02.Id $vm = Set-AzureRmVMOSDisk -VM $vm -Name $vmosname -VhdUri $osDiskUrl -CreateOption FromImage -SourceImageUri $ImageURL -Linux New-AzureRmVM -ResourceGroupName $rgname -Location "China East" -VM $vm } $rgname = "ciscorouter" $vmname = "hwcisco01" $hasetname = "hwcisco01" #Please check the haset isn't avalible $vmpipname = "hwcisco01pip" $vnetname = "hwcisco01" $subnetname1 = "vlan1" $subnetname2 = "vlan2" $vmsize = "Standard_D2" $newpwd = "abc@12345678" $newuser = "hengwei" $ImageURL = "https://ciscorouter.blob.core.chinacloudapi.cn/image/CSR_3_16_4aS_CCO.vhd" new-ciscocsr -rgname ciscorouter -vmname hwcisco -hasetname hwcisco -vmpipname hwciscopip -vnetname hwcisco -subnetname1 vlan1 -subnetname2 vlan2 -vmsize Standard_D2 -newuser hengwei -newpwd abc@12345678 -ImageURL https://ciscorouter.blob.core.chinacloudapi.cn/image/CSR_3_16_4aS_CCO.vhd -Verbose -Debug
三、登入路由器
ssh hengwei@42.159.143.24 Connecting to 42.159.143.24:22... Connection established. To escape to local shell, press Ctrl+Alt+]. hwcisco# hwcisco#conf t Enter configuration commands, one per line. End with CNTL/Z. hwcisco(config)#int g 2 hwcisco(config-if)#no shu hwcisco(config-if)#ip add dhcp hwcisco(config-if)#end hwcisco#wr Building configuration... [OK] hwcisco#term mon *Apr 25 08:17:36.064: %DHCP-6-ADDRESS_ASSIGN: Interface GigabitEthernet2 assigned DHCP address 172.16.2.4, mask 255.255.255.0, hostname hwcisco hwcisco#sh ip int brie Interface IP-Address OK? Method Status Protocol GigabitEthernet1 172.16.1.4 YES DHCP up up GigabitEthernet2 172.16.2.4 YES DHCP up up