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

[Azure]使用Powershell重新生成ARM虚拟机网卡

2017-03-14 19:57 441 查看
Azure ARM 的 Windows 虚拟机如果将网卡禁用会直接导致无法连接。

解决方法是将网卡的内网IP地址设置为静态地址,将地址的值修改为子网下的另外一个未使用的地址即可。保存设置后,这个操作会为虚拟机分配一个新的网卡。

除了上面简单的方法外,还可以使用下面的脚本进行网卡重置,脚本本身相对于上面的操作要复杂的多,之所以写出来,主要是方便更为深入的理解 ARM 模式下各个功能组件互相之间的关联关系。

脚本如下:

param(
#The name of the subscription to take all the operations within.
[Parameter(Mandatory = $true)]
[string]$SubscriptionName,

# Resource Group Name
[Parameter(Mandatory = $true)]
[string]$ResourceGroupName,

# Virtual Machine Name
[Parameter(Mandatory = $true)]
[string]$VMName
)

Function GetResourceNameFromResourceId($resourceId)
{
return $resourceId.Substring($resourceId.LastIndexOf('/')+1);
}

Function GetResourcePropertyFromResourceId($resourceId, $propertyName)
{
$propertyName = $propertyName + "/";
$rgName = $resourceId.Substring($resourceId.IndexOf($propertyName)+$propertyName.Length);
return $rgName.Substring(0, $rgName.IndexOf("/"));
}

Function RebuildVirtualMachineNetworkInterface() {
Write-Host "Collecting Virtual Machine Information...";
$vm = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName;

$oldNicId = $vm.NetworkProfile.NetworkInterfaces[0].Id;
if ($oldNicId -eq $null)
{
Write-Host "Failed to get network interface of the virtual machine.";
return;
}
$oldNicName = GetResourceNameFromResourceId $oldNicId;
$oldNicResourceGroup = GetResourcePropertyFromResourceId $oldNicId "resourceGroups";
$oldNic = Get-AzureRmNetworkInterface -Name $oldNicName -ResourceGroupName $oldNicResourceGroup;
Write-Host "Network interface information collected.";
Write-Host "Network interface name:" $oldNicName;
Write-Host "Network interface resource group name:" $oldNicResourceGroup;

$oldPublicIPId = $oldNic.IpConfigurations[0].PublicIpAddress.Id;
if ($oldPublicIPId -eq $null)
{
Write-Host "Failed to get public ip of the virtual machine.";
}
$oldPublicIPName = GetResourceNameFromResourceId $oldPublicIPId;
$oldPublicIPResourceGroup = GetResourcePropertyFromResourceId $oldPublicIPId "resourceGroups";
$oldPublicIP = Get-AzureRmPublicIpAddress -Name $oldPublicIPName -ResourceGroupName $oldPublicIPResourceGroup;
Write-Host "Public ip information collected.";
Write-Host "Public ip name:" $oldPublicIPName;
Write-Host "Public ip resource group name:" $oldPublicIPResourceGroup;

if ($oldPublicIP.PublicIpAllocationMethod -eq "Dynamic")
{
$oldPublicIP.PublicIpAllocationMethod = "Static";
[void]($oldPublicIP | Set-AzureRmPublicIpAddress);
Write-Host "Successfully set current public ip address to 'Static'";
}

$subnetId = $oldNic.IpConfigurations[0].Subnet.Id;
if ($subnetId -eq $null)
{
Write-Host "Failed to get vnet information of the virtual machine.";
}
$subnetName = GetResourceNameFromResourceId $subnetId;
$vnetName = GetResourcePropertyFromResourceId $subnetId "virtualNetworks";
$vnetResourceGroup = GetResourcePropertyFromResourceId $subnetId "resourceGroups";
$vnet = Get-AzureRmVirtualNetwork -Name $vnetName -ResourceGroupName $vnetResourceGroup;
$subnet = Get-AzureRmVirtualNetworkSubnetConfig -Name $subnetName -VirtualNetwork $vnet;
$location = $vnet.Location;
Write-Host "Vnet information collected.";
Write-Host "Vnet name:" $vnetName;
Write-Host "Subnet name:" $subnetName;
Write-Host "Vnet resource group name:" $vnetResourceGroup;
Write-Host "Location:" $location;

Write-Host "Renewing network interface...";
$newPublicIP = New-AzureRmPublicIpAddress -Name ($oldPublicIP.Name + "Renewed") -ResourceGroupName $vnetResourceGroup -Location $location -AllocationMethod Dynamic;
$oldNic.IpConfigurations[0].PublicIpAddress = $newPublicIP;
[void]($oldNic | Set-AzureRmNetworkInterface);
Write-Host "Finished deassociate old network interface";

$oldPrivateIP = $oldNic.IpConfigurations[0].PrivateIpAddress;
Write-Host "Old private ipaddress copied";

Write-Host "Creating a new network interface";
$newNic = $null;
if ($oldNic.NetworkSecurityGroup -eq $null)
{
$newNic = New-AzureRmNetworkInterface -Name ($oldNic.Name + "Renewed") -ResourceGroupName $oldNicResourceGroup -Location $location -SubnetId $subnetId -PublicIpAddressId $oldPublicIP.Id;
} else {
$nicNsg = $oldNic.NetworkSecurityGroup;
$newNic = New-AzureRmNetworkInterface -Name ($oldNic.Name + "Renewed") -ResourceGroupName $oldNicResourceGroup -Location $location -SubnetId $subnetId -PublicIpAddressId $oldPublicIP.Id -NetworkSecurityGroupId $nicNsg.Id;
}
Write-Host "Finished new network interface creation";

[void](Remove-AzureRmVMNetworkInterface -VM $vm -NetworkInterfaceIDs $vm.NetworkProfile.NetworkInterfaces[0].Id);
[void](Add-AzureRmVMNetworkInterface -VM $vm -Id $newNic.Id -Primary);
[void](Update-AzureRmVM -VM $vm -ResourceGroupName $ResourceGroupName);
Write-Host "Finished renewing network interface";

Write-Host "Deleting old network interface";
# Remove old NIC
[void](Remove-AzureRmNetworkInterface -Name $oldNic.Name -ResourceGroupName $oldNicResourceGroup -Force);
[void](Remove-AzureRmPublicIpAddress -Name $newPublicIP.Name -ResourceGroupName $newPublicIP.ResourceGroupName -Force);
Write-Host "Old network interface deleted";

Write-Host "Reset private ip address";
$newNic = Get-AzureRmNetworkInterface -Name $newNic.Name -ResourceGroupName $newNic.ResourceGroupName;
$newNic.IpConfigurations[0].PrivateIpAddress = $oldPrivateIP;
$newNic.IpConfigurations[0].PrivateIpAllocationMethod = "Static";
[void]($newNic | Set-AzureRmNetworkInterface);
Write-Host "Succeeded";
}

[void](Select-AzureRmSubscription -SubscriptionName $SubscriptionName);

RebuildVirtualMachineNetworkInterface;


脚本运行示例:

PS C:\Users\DanielHX> &.\[ARM]rebuild_virtualmachine_networkinterface.ps1 -SubscriptionName XXXXXXXXXXX -ResourceGroupName XXXXXX -VMName XXXXXXXX

Collecting Virtual Machine Information...

Network interface information collected.

Network interface name: danserver2012r2629Renewed

Network interface resource group name: DanEastResourceGroup1

Public ip information collected.

Public ip name: DanServer2012R2ip956

Public ip resource group name: DanEastResourceGroup1

Vnet information collected.

Vnet name: DanEastVNET

Subnet name: Subnet-1

Vnet resource group name: DanEastResourceGroup1

Location: chinaeast

Renewing network interface...

Finished deassociate old network interface

Old private ipaddress copied

Creating a new network interface

Finished new network interface creation

Finished renewing network interface

Deleting old network interface

Old network interface deleted

Reset private ip address

Succeeded

PS C:\Users\DanielHX>

脚本运行后,虚拟机网卡会重新生成,原公网IP和内网IP不会发生变化。




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