更改这些以匹配源帐户

更改这些以匹配源帐户

我最近在一个存储帐户中捕获了一个 Azure VM 映像,并计划将此映像迁移到另一个订阅下的另一个存储帐户。我使用 PowerShell 脚本来运行此任务,但遇到了这个问题:未找到存储帐户。还有一个问题是 PowerShell 必须与特定的 Azure 帐户相关,否则它无法运行脚本。所以故事是如何使用 PowerShell 同时控制不同的订阅,并执行迁移任务?谢谢。

顺便说一下,PowerShell 脚本如下所示:

更改这些以匹配源帐户

$sourceStorageAccountName = "" $sourceContainerName = "" $sourceStorageKey = "" #如果从其他订阅移动数据,则需要此项

目的地帐户信息

$destStorageAccountName = Read-Host "输入目标存储帐户名称" $destStorageAccountKey = Get-AzureStorageKey $destStorageAccountName | %{$_.Primary} $destContainerName = Read-Host "输入目标容器名称"

$sourceContext = New-AzureStorageContext -存储帐户名称 $sourceStorageAccountName -存储帐户密钥 $sourceStorageKey -协议 Http $destContext = New-AzureStorageContext -存储帐户名称 $destStorageAccountName -存储帐户密钥 $destStorageAccountKey

$uri = $sourceContext.BlobEndPoint + $sourceContainerName +“/”

复制操作

Get-AzureStorageBlob -Context $sourceContext -Container $sourceContainerName | ForEach-Object { Start-AzureStorageBlobCopy -SrcUri“$uri$($_.Name)”- -DestContext $destContext DestContainer $destContainerName -DestBlob "hackathon/$($_.Name)" }

检查 Blob 复制的状态——如果不需要确认,可以将其注释掉

Get-AzureStorageBlob -Context $sourceContext -容器 $sourceContainerName | ForEach-Object { Get-AzureStorageBlobCopyState -Blob $_.Name -Context $destContext -容器 $destContainerName -WaitForComplete }

问题是这样的:Get-AzureStorageKey:没有指定当前订阅。使用 Select-AzureSubscription -Current 设置当前订阅。

答案1

Azure 几乎不支持将任何 Azure 服务从一个订阅切换到另一个订阅。

如果您创建了票证,顺便说一下,我已经这样做了,您可以让 Azure 支持人员手动将所有服务从一个订阅(源)切换到另一个订阅(目标),其中目标订阅在该订阅中没有任何服务。

您不能从源订阅中选择单个服务进行传输到目标订阅(从源订阅全部传输或全部不传输),并且您不能在目标订阅中拥有任何现有服务。

**服务是任何 Azure 功能(VM、网站、存储 Blob 等)

支持代表可能之前没有执行过此过程,您必须让他们知道这是可行的,我的支持代表花了大约一周的时间才弄清楚。确保在与 Azure 支持代表的所有对话中使用本地源订阅和目标订阅以及两个订阅的 GUID。

现在对于特定的 VM,看起来您可以使用名为 AzCopy 的工具将 VM 从一个存储帐户复制到另一个存储帐户,请查看本文:

http://thecodejunkie.com/2014/01/20/copying-virtual-machines-between-azure-subscriptions/

答案2

尝试这个:

Select-AzureSubscription -SubscriptionName "EXISTING SUBSCRIPTION NAME"
#Get-AzureVM

$vmName = "YOUR_VM_NAME"
$serviceName = "CLOUD_SERVICE_NAME"
$destServiceName = "NEW_CLOUD_SERVICE_NAME"
$workingDir = (Get-Location).Path

$sourceVm = Get-AzureVM -ServiceName $serviceName -Name $vmName
$vmConfigurationPath = $workingDir + "\exportedVM.xml"
$sourceVm | Export-AzureVM -Path $vmConfigurationPath

$sourceOSDisk = $sourceVm.VM.OSVirtualHardDisk
$sourceDataDisks = $sourceVm.VM.DataVirtualHardDisks

$sourceStorageName = $sourceOSDisk.MediaLink.Host -split "\." | select -First 1
$sourceStorageAccount = Get-AzureStorageAccount -StorageAccountName $sourceStorageName
$sourceStorageKey = (Get-AzureStorageKey -StorageAccountName $sourceStorageName).Primary

Stop-AzureVM -ServiceName $serviceName -Name $vmName -Force

Select-AzureSubscription -SubscriptionName "NEW SUBSCRIPTION NAME"

$location = $sourceStorageAccount.Location

$destStorageAccount = Get-AzureStorageAccount | ? {$_.Location -eq $location} | select -first 1
if ($destStorageAccount -eq $null)
{   
    $destStorageName = "NEW_STORAGE_NAME"
New-AzureStorageAccount -StorageAccountName $destStorageName -Location $location
$ destStorageAccount = Get-AzureStorageAccount -StorageAccountName $destStorageName
}
$destStorageName = $destStorageAccount.StorageAccountName
$destStorageKey = (Get-AzureStorageKey -StorageAccountName $destStorageName).Primary

$sourceContext = New-AzureStorageContext  -StorageAccountName $sourceStorageName `
    -StorageAccountKey $sourceStorageKey 
$destContext = New-AzureStorageContext  -StorageAccountName $destStorageName `
    -StorageAccountKey $destStorageKey 

if ((Get-AzureStorageContainer -Context $destContext -Name vhds -ErrorAction SilentlyContinue) -eq $null)
{
    New-AzureStorageContainer -Context $destContext -Name vhds
}

$allDisks = @($sourceOSDisk) + $sourceDataDisks
$destDataDisks = @()
foreach($disk in $allDisks)
{   
    $blobName = $disk.MediaLink.Segments[2]
    $targetBlob = Start-CopyAzureStorageBlob -SrcContainer vhds -SrcBlob $blobName `
                                            -DestContainer vhds -DestBlob $blobName `
                                            -Context $sourceContext -DestContext $destContext -Force
    Write-Host "Copying blob $blobName"
    $copyState = $targetBlob | Get-AzureStorageBlobCopyState
    while ($copyState.Status -ne "Success")
    {           
        $percent = ($copyState.BytesCopied / $copyState.TotalBytes) * 100       
        Write-Host "Completed $('{0:N2}' -f $percent)%"
        sleep -Seconds 5
        $copyState = $targetBlob | Get-AzureStorageBlobCopyState
    }
    If ($disk -eq $sourceOSDisk)
    {
        $destOSDisk = $targetBlob
    }
    Else
    {
        $destDataDisks += $targetBlob
    }
}

Add-AzureDisk -OS $sourceOSDisk.OS -DiskName $sourceOSDisk.DiskName -MediaLocation $destOSDisk.ICloudBlob.Uri
foreach($currenDataDisk in $destDataDisks)
{
    $diskName = ($sourceDataDisks | ? {$_.MediaLink.Segments[2] -eq $currenDataDisk.Name}).DiskName    
    Add-AzureDisk -DiskName $diskName -MediaLocation $currenDataDisk.ICloudBlob.Uri
}

Get-AzureSubscription -Current | Set-AzureSubscription -CurrentStorageAccountName $destStorageName

$vmConfig = Import-AzureVM -Path $vmConfigurationPath
New-AzureVM -ServiceName $destServiceName -Location $location -VMs $vmConfig -WaitForBoot

Get-AzureRemoteDesktopFile -ServiceName $destServiceName -Name $vmConfig.RoleName -LocalPath ($workingDir+"\newVM.rdp")`

答案3

您可以使用 DC 迁移工具(一种开源工具)将 Azure 资源从一个订阅复制到跨数据中心的其他订阅。

Azure 数据中心迁移工具博客http://blog.persistentsys.com/index.php/2015/01/06/persistent-systems-releases-azure-data-center-migration-solution/

相关内容