首页 > 代码库 > ARM模式下使用自定义镜像部署VM

ARM模式下使用自定义镜像部署VM

目前在中国区的Azure新portal上面, 暂时不支持直接将用户的虚拟机创建为虚拟机镜像,那么在ARM模式下如何捕获虚拟机为用户自定义镜像?而且由于managed disk没有上线,用户创建的虚拟机只能和镜像在一个存储账号下,如何快速的将用户自定义镜像拷贝到其他存储账号,并且快速创建VM?本文就这些常见问题给出一个简单易用的快速解决办法

本文介绍的主要主题如下:

  • Linux/Mac下如何使用Azure CLI捕获ARM下虚拟机镜像
  • 使用ARM模板使用自定义镜像快速创建虚拟机
  • 通过Azure CLI在不同账号使用自定义镜像创建虚拟机

 

使用Azure CLI捕获Linux镜像

  1. 首先ARM模式下创建一台Linux虚拟机:

    技术分享

  2. 目前中国区Azure并不支持Azure CLI2.0,所以请注意安装 CLI 1.x。Linux命令行下安装Azure Command Line:

    sudo npm install -g azure-cli

     

    技术分享

     

  3. 安装完成后,检查当前Azure CLI的版本:

    Azure --version

     

    技术分享

     

  4. 登录Azure China账户,我们使用非交互式登录,-u跟你的用户名,可直接写-p后加密码,-e需要指定是中国Cloud:

     

    azure login -u USERNAME -p PASSWORD -e AzureChinaCloud

     

    技术分享

     

  5. 对于已经创建的Linux VM,为了捕获镜像,我们首先需要通用化,也就是把一些该虚拟机特有的个人数据,UUID等清除,便于大规模部署,相当于Windows服务器中的sys-prep操作,使用SSH登录到该Linux虚拟机,执行:

     

    sudo waagent -deprovision+user

     

    技术分享

     

  6. 回到Azure Command Line界面下,我们切换到ARM模式,然后停止这个模板VM,并取消分配:

    azure config mode arm

    azure vm deallocate -g myubuntueast -n myvmubuntu

技术分享

  1. 使用Azure Command Line通用化VM:

azure vm generalize -g myubuntueast -n myvmubuntu

技术分享

  1. 然后使用azure命令capture来捕获VM为自定义镜像了:

     

    azure vm capture -g myubuntueast -n myvmubuntu -p myvmubuntu -t myTemplate.json

     

技术分享

 

模板文件中存放着OS VHD文件地址,保存以便后续操作使用。

  1. 创建完成后,使用Storage Explorer查看,就可以看到在System目录下,创建了两个文件,一个VHD,一个json文件:

    技术分享

     

使用ARM模板从自定义镜像创建VM

 

  1. 自定义镜像创建完成后,在ARM模式下,最简单的方式,就是使用ARM模板来创建虚拟机,那么我们可以使用QuickStart里面的模板101-vm-from-user-image 来创建虚拟机,首先使用Git克隆这个repo:

 

技术分享

 

  1. 将101-vm-from-user-image目录拷贝到根目录,可以看到里面有6个文件,其中azuredeploy.json是主要文件,parameter是参数文件, newvnet是一个嵌套的模板,创建新的vnet,而existingvnet是处理已有的vnet:

 

技术分享

 

  1. 我们需要修改的是azuredeploy.parameters.json文件,该文件包含了新创建VM的模板镜像地址,用户名,密码,虚拟机网络等信息,镜像的存储URL可以从捕获VM产生的myTemplate.json文件中获得,例如打开该模板文件,我的osDisk地址是:

     

"uri": https://myvmlinux.blob.core.chinacloudapi.cn/system/Microsoft.Compute/Images/vhds/myvmubuntu-osDisk.c8102a9a-f110-452d-b30a-e4735c2841f4.vhd

  1. 修改parameter文件,其中比较重要的部分是镜像地址如下,另外我们在本例中使用已有的虚拟网络,已有的虚拟网络子网:

"osDiskVhdUri": { "value": https://myvmlinux.blob.core.chinacloudapi.cn/system/Microsoft.Compute/Images/vhds/myvmubuntu-osDisk.c8102a9a-f110-452d-b30a-e4735c2841f4.vhd}

"newOrExistingVnet": {

"value": "existing"},

"n"newOrExistingVnetName": {

"value": "myubuntueast-vnet"},

"n"newOrExistingSubnetName": {

"value": "default"},

  1. 使用Azure CLI来进行模板部署,使用客户自定义的镜像:

    azure group deployment create --name="mylinuxcustodeployment" --resource-group="myubuntueast" --template-file="azuredeploy.json" --parameters-file="azuredeploy.parameters.json"

 

技术分享

 

部署成功后,可以看到输入相关的信息如下:

 

技术分享

 

  1. 登录Azure新portal,查看新创建的虚拟机状态及组件:

    技术分享

  2. 最后使用SSH连接到这个Linux VM做个简单测试,可以看到,可以成功连接到该虚拟机:

技术分享

 

注:这个末班中没有定义NSG,如果正式环境里面,请添加相关NSG配置进行虚拟机创建。

使用Azure CLI通过自定义镜像创建VM

我们创建了虚拟机镜像作为标准模板后,需要分发到不同的存储账号进行虚拟机的创建,那么如何快速的拷贝镜像呢?当然可以使用azcopy等工具 ,但如果只是测试或者镜像数量比较少,建议使用Storage Explorer,该工具是图形化界面,拷贝加速,并且适用于Linux,windows和Mac平台,下载地址:

http://storageexplorer.com/

  1. 找到你的镜像目录,该目录在你捕获镜像的时候,创建了一个system容器,并且适用Microsoft.Compute命名:

     

    技术分享

     

    在当前目录下选择则该目录,单击菜单上的copy,选择目的存储目录,单击paste,就可以看到整个目录开始拷贝,及时你有多个VHD文件,也会同时拷贝过去:

    技术分享

     

    技术分享

     

  2. 拷贝完自定义镜像以后,找到该镜像新位置的URL,然后就可以用Azure CLI来快速创建VM了,在本例中,我们使用已创建的资源组,已经存在的虚拟网络和子网,进行虚拟机创建,那么在开始创建之前,需要先创建一个公网IP和NIC:

     

    azure network public-ip create myubuntueast myPublicCust2IP -l "chinaeast"

    技术分享

     

    创建网络安全组并且创建22端口的SSH规则:

     

    #Create NSG group    

    azure network nsg create --resource-group myubuntueast --location chinaeast

    --name myNetworkSecurityGroup

     

    技术分享

     

    azure network nsg rule create --resource-group myubuntueast

    --nsg-name myNetworkSecurityGroup --name myNetworkSecurityGroupRuleSSH

    --protocol tcp --direction inbound --priority 1000 --source-address-prefix ‘*‘

    --source-port-range ‘*‘ --destination-address-prefix ‘*‘ --destination-port-range 22

    --access allow

     

    技术分享

     

    azure network nic create myubuntueast myCust3NIC -k default

         -m myubuntueast-vnet

         --network-security-group-name myNetworkSecurityGroup

         -p myPublicCust2IP -l "chinaeast"

    技术分享

     

     

     

  3. 使用Azure CLI,定制化镜像,和之前创建的NIC和Pub IP来创建虚拟机:

     

    azure vm create -g myubuntueast -n myCustVM3 -l "chinaeast" -y Linux -z Standard_D3

    -u azureuser -p Azure123! -f myCust3NIC

    -d https://myvmstorage.blob.core.chinacloudapi.cn/vhds/myCustVM3.vhd \

    -Q "https://myvmstorage.blob.core.chinacloudapi.cn/system/Microsoft.Compute/Images/vhds/myvmubuntu-osDisk.c8102a9a-f110-452d-b30a-e4735c2841f4.vhd"

     

    技术分享

     

    创建完成后,检查Azure的管理界面,可以看到虚拟机已经正常运行:

    技术分享

     

     

  4. 使用SSH登录到虚拟机进行测试,可以看到一切正常,我们在之前NSG的设置中,已经打开了SSH端口:

    技术分享

ARM模式下使用自定义镜像部署VM