并发批量创建Azure虚机
在Azure上建虚机的方法有很多种,除了直接在Azure Portal 上创建之外,我们还可以用ARM模版 (参考:https://github.com/Azure/azure-quickstart-templates ), PowerShell 和 Azure CLI.
- 熟悉PowerShell的直接用PowerShell上手最快,具体可以参考https://docs.microsoft.com/zh-cn/powershell/azure/install-az-ps?view=azps-3.7.0 , 现在到了3.6的版本也精简了很多,命令从Azure, AzureRM到现在的Az。
- 如果对PowerShell不熟而对Linux shell或cmd/bat脚本较熟的,那用Azure CLI是最快上手的。https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli?view=azure-cli-lates
当然,我们今天讨论的重点是如何快速的批量创建N台虚机。如果果一台一台的建,数量较多的话会比较慢,Azure其实支持并发的创建资源,对没有依赖的组件可以同时创建,比如不同虚机的IP, 网卡。需要并发的请求我们可以借助bash shell的后台执行能力,如:
for i in `seq $iSTART $VMCOUNT`; do { ... } & done wait #等待并发完成
一些公共的资源建议手工先建好,比如资源组,vnet, nsg等,然后把名字放进脚本就可以。当然也可以用脚本一并建完,完整的可以参考如下:
1 #!/bin/bash 2 3 REGION="koreacentral" #替换成中东的区域名称 4 RGNAME="kc-rg" 5 VMNAME="batchvm-" #虚机名字前缀 6 VMSIZE="Standard_A0" #替换成你的型号 Standard_D64s_v3 7 IMAGE="OpenLogic:CentOS:7.7:7.7.201912090" # /subscriptions/1bab3e78-2764-4555-845d-297f7a7ca7c0/resourceGroups/Tencent-india-s-game/providers/Microsoft.Compute/galleries/centos74/images/centos74/versions/0.0.1" #OpenLogic:CentOS:7.4:7.4.20171206" #建议不要改 8 VNET="batchvnet" #替换成你的虚拟网络名字 9 SUBNET="public1" #替换成你的子网名字 10 USERNAME="xxxxx" #替换成你的用户名,不能为root 11 PASSWORD="xxxxxxx" #替换成你的密码 12 DATADISKSIZE=200 13 OSDISKSIZE=50 14 STORAGETYPE="Standard_LRS" #Premium_LRS" 15 AVAILABILITYSET="avset-bat1-"$REGION 16 NSG="batchnsg" 17 18 iSTART=1 #起始序号 19 VMCOUNT=1 #结束序号 20 21 # az account set -s 1bab3e78-2764-4555-845d-297f7a7ca7c0 22 starttime=`date +'%Y-%m-%d %H:%M:%S'` 23 echo 创建资源组 24 az group create -n $RGNAME -l $REGION 25 26 echo 创建VNet 27 az network vnet create --resource-group $RGNAME --location $REGION --name $VNET --subnet-name $SUBNET 28 29 30 echo 创建可用性集 31 az vm availability-set create --resource-group $RGNAME --name $AVAILABILITYSET --platform-fault-domain-count 2 --platform-update-domain-count 3 32 33 echo 创建网络安全组NSG 34 az network nsg create --resource-group $RGNAME --name $NSG 35 36 echo Create a network security group rule for port 22. 37 az network nsg rule create --resource-group $RGNAME --nsg-name $NSG --name myNetworkSecurityGroupRuleSSH \ 38 --protocol tcp --direction inbound --source-address-prefix '*' --source-port-range '*' \ 39 --destination-address-prefix '*' --destination-port-range 22 --access allow --priority 1000 40 41 echo 创建n个公网IP和VM网卡 42 for i in `seq $iSTART $VMCOUNT`; do 43 { 44 # Create a public IP address. 45 echo $VMNAME$i"-ip" 46 az network public-ip create --sku Standard --resource-group $RGNAME --name $VMNAME$i"-pip" --allocation-method static 47 echo $VMNAME$i"-nic" 48 az network nic create \ 49 --resource-group $RGNAME --name $VMNAME$i"-nic" \ 50 --vnet-name $VNET --subnet $SUBNET \ 51 --network-security-group $NSG --public-ip-address $VMNAME$i"-pip" 52 53 #--accelerated-networking true \ #需要加速网络可以加上 54 55 #修改内网IP为静态 56 az network nic update -g $RGNAME -n $VMNAME$i"-nic" \ 57 --set ipConfigurations[name=ipconfig1].privateIpAllocationMethod="static" --no-wait 58 } & 59 60 done 61 62 wait #等待并发建网卡批次完成 63 64 echo 创建n个VM 65 for i in `seq $iSTART $VMCOUNT`; do 66 { 67 echo $VMNAME$i 68 az vm create \ 69 --name $VMNAME$i --resource-group $RGNAME --image $IMAGE \ 70 --admin-username $USERNAME --admin-password $PASSWORD \ 71 --size $VMSIZE --nics $VMNAME$i"-nic" \ 72 --availability-set $AVAILABILITYSET \ 73 --storage-sku $STORAGETYPE 74 75 76 # 执行自定义初始化脚本 77 echo $VMNAME$i"-dsc" 78 az vm extension set \ 79 --publisher Microsoft.Azure.Extensions \ 80 --name CustomScript \ 81 --version 2.0 \ 82 --settings '{"fileUris": ["https://rade.blob.core.windows.net/dsc/pubgdsc.sh"], "commandToExecute":"./pubgdsc.sh '$PASSWORD' /data "}'\ 83 --vm-name $VMNAME$i \ 84 --resource-group $RGNAME 85 86 # az vm restart -g $RGNAME -n $VMNAME$i --no-wait 87 } & 88 done 89 wait #等待并发批次完成 90 91 echo "All done" 92 endtime=`date +'%Y-%m-%d %H:%M:%S'` 93 start_seconds=$(date --date="$starttime" +%s); 94 end_seconds=$(date --date="$endtime" +%s); 95 echo "本次运行时间: "$((end_seconds-start_seconds))"s"
我完整跑完的效果如下图,30台虚机,加上前面建资源组,vnet/nsg/avset, 以及跑自定义DSC等的时间,只用了410秒。