zoukankan      html  css  js  c++  java
  • ARM 环境下使用azure powershell 从远程blob中拉去vhd 并创建虚拟机

    最近需要从指定公共访问的blob中复制vhd到自己的订阅存储账户,并使用vhd创建AZURE ARM虚拟机(非经典版),而且在portal.azure.cn中无法实现虚拟机映像创建等功能,于是自己使用azure powershell写了一个简单的脚本,

    前期准备:

    1、在ARM环境下,创建一个普通存储(切记一定要是普通存储,高级存储无法创建虚拟机),不要创建成经典版

    2、将新建的普通存储名称和key填入到以下脚本中

    备注:创建虚拟机时,脚本会自动将vhd复制一份作为系统盘,切记,指定系统盘的位置要和拷贝后vhd放于同一个blob中,不然会报错误

    脚本简介:

    运行脚本会自动从源blob中(本脚本是匿名方式拷贝,所以对方存储必须为公共存储)拷贝vhd文件到指定订阅的存储账户(必须有key),拷贝成功后开始创建ARM 虚拟机,此脚本适合单独创建虚拟机

    创建说明:拷贝vhd文件到普通存储()

    #源存储blob信息- VHD所在的存储地址
    $sourceStorageAccountName = "{存储账户名称}" #存储账户名称
    $sourceContainerName = "{容器名称}" #容器名称
    $fileName="xxxx.vhd" #容器中文件的名称及扩张名

    #目标存储信息---- 从isv复制到经典存储中速度快,建议配置成经典的存储地址
    $destStorageAccountName ="{目标存储账户}" #目标存储账户名称--要拷贝到自己账户的存储名称
    $destContainerName ="{容器名称}" #VHD所在容器名称- 要小写字母
    $destStorageAccountKey ="{存储访问key}"#key

    #要创建资源组的名称
    $resourceGroupName="{资源组名称}"

    #虚拟机信息
    $vmname = "RapidREVMA" #虚拟机名称-虚拟机磁盘也会使用此名称
    $vmUser="azureuser"
    $vmSize="Standard_A8_v2" #虚拟机大小:https://docs.microsoft.com/zh-cn/azure/cloud-services/cloud-services-sizes-specs#av2-series
    $osType=0 #0-windows 1-Linux

    #公共配置信息-默认即可,不用配置
    $securePassword = ConvertTo-SecureString '{订阅登录密码}' -AsPlainText -Force
    $credlogin = New-Object System.Management.Automation.PSCredential ("xxxxxx@xxxxxxx.partner.onmschina.cn", $securePassword) #将xxxx更换为自己账户的信息即可
    $endpoint="core.chinacloudapi.cn"
    $fileAbsoluteUri="https://"+$sourceStorageAccountName+".blob."+$endpoint+"/"+$sourceContainerName+"/"+$fileName
    $locationStr="China North"
    $osdiskurl = "https://"+$destStorageAccountName+".blob."+$endpoint+"/"+$destContainerName+"/" #拷贝后的vhd所在存储账户url地址(不包含文件名)

    #开始复制
    $sourceContext = New-AzureStorageContext -StorageAccountName $sourceStorageAccountName -Endpoint $endpoint -Anonymous;
    $destContext = New-AzureStorageContext -StorageAccountName $destStorageAccountName -StorageAccountKey $destStorageAccountKey -Endpoint $endpoint
    $getdestContainerName=Get-AzureStorageContainer -Context $destContext -ErrorAction Stop | where-object {$_.Name -eq $destContainerName}

    if(!$getdestContainerName)
    {
    New-AzureStorageContainer -Name $destContainerName -Context $destContext
    }

    Start-AzureStorageBlobCopy -AbsoluteUri $fileAbsoluteUri -DestContext $destContext -DestContainer $destContainerName -DestBlob $fileName

    #Checking Status of Blob Copy -- This can be commented out if no confirmation is needed
    $copyStatus=Get-AzureStorageBlobCopyState -Blob $fileName -Context $destContext -Container $destContainerName -WaitForComplete

    if($copyStatus.Status -eq "Success")
    {
    Write-Host "copy finsh and start create vm"

    #登录并创建指定资源组
    Login-AzureRmAccount -EnvironmentName AzureChinaCloud -Credential $credlogin
    New-AzureRmResourceGroup -Name $resourceGroupName -Location $locationStr

    # Create a subnet configuration
    $subnetConfig = New-AzureRmVirtualNetworkSubnetConfig -Name mySubnet -AddressPrefix 192.168.1.0/24

    # Create a virtual network
    $vnet = New-AzureRmVirtualNetwork -ResourceGroupName $resourceGroupName -Location $locationStr -Name MyVNet -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig -Force

    #创建一个公网IP地址:
    $publicIP=New-AzureRmPublicIpAddress -Name createstfromPIP -ResourceGroupName $resourceGroupName -Location $locationStr -AllocationMethod Dynamic -IpAddressVersion IPv4 -Force #新建
    Get-AzureRmPublicIpAddress -Name createstfromPIP -ResourceGroupName $resourceGroupName #查看刚刚创建的公网IP信息

    #创建可用性集:
    #$Availabilityset = New-AzureRmAvailabilitySet -Name cranetestAV -ResourceGroupName crane -Location $locationStr

    #创建网卡:
    $nic=New-AzureRmNetworkInterface -Name VHDNIC -ResourceGroupName $resourceGroupName -Location $locationStr -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $publicIP.Id -Force

    #配置要使用的存储账号以及系统盘名称:
    #$storage = Get-AzureRmStorageAccount -Name cranenorthtest -ResourceGroupName $resourceGroupName
    #$vmname = "whxCreateVmTest"
    $osdiskname = $vmname + "_OSDisk"
    #$osdiskurl = "https://ygwhxteststg.blob.core.chinacloudapi.cn/whx-vhd/community-15186-37f6baac-720f-4e49-b2f7-9c39f44a82f9-1.vhd"
    $vmOsDisk =$osdiskurl+$osdiskname+".vhd"
    $cred = New-Object System.Management.Automation.PSCredential ($vmUser, $securePassword)
    $osdiskAbsoluteUri=$osdiskurl+$fileName

    #生成虚拟机的配置,将新建的虚拟机放在虚拟网络:
    if($osType.Equals(1))#linux创建
    {
    $vmconfig = New-AzureRmVMConfig -VMName $vmname -VMSize $vmSize |`
    Set-AzureRmVMOperatingSystem -Linux -ComputerName $vmname -Credential $cred| `
    Set-AzureRmVMOSDisk -Name $osdiskname -VhdUri $vmOsDisk -SourceImageUri $osdiskAbsoluteUri -CreateOption FromImage -Linux | `
    Add-AzureRmVMNetworkInterface -Id $NIC.Id
    }
    if($osType.Equals(0)) #windows创建
    {
    $vmconfig = New-AzureRmVMConfig -VMName $vmname -VMSize $vmSize |`
    Set-AzureRmVMOperatingSystem -Windows -ComputerName $vmname -Credential $cred| `
    #-ProvisionVMAgent -EnableAutoUpdate | `
    Set-AzureRmVMOSDisk -Name $osdiskname -VhdUri $vmOsDisk -SourceImageUri $osdiskAbsoluteUri -Caching "ReadWrite" -CreateOption FromImage -Windows | `
    Add-AzureRmVMNetworkInterface -Id $nic.Id -Primary
    }

    #创建虚拟机:
    New-AzureRmVM -ResourceGroupName $resourceGroupName -Location $locationStr -VM $vmconfig

    $vmList = Get-AzureRmVM -ResourceGroupName $resourceGroupName
    $vmList.Name
    }
    else
    {
    Write-Host "复制失败或出现错误"
    }

  • 相关阅读:
    tfrecord汇总
    python2中的编码的问题
    python multiprocessing的问题
    转载,ubuntu shell ~/.bashrc /etc/bash.bashrc
    singleton模式 Python
    目标检测 tensorflow(预训练模型)
    functools.partial 小记
    python 踩坑小计 virtualenv-site-packages
    python3.6 _tkinter module问题 python源码重新编译
    windows核心编程之网络编程入门篇
  • 原文地址:https://www.cnblogs.com/oceanwang/p/7762810.html
Copyright © 2011-2022 走看看