并发批量创建Azure虚机

在Azure上建虚机的方法有很多种,除了直接在Azure Portal 上创建之外,我们还可以用ARM模版 (参考:https://github.com/Azure/azure-quickstart-templates ), PowerShell 和 Azure CLI.

当然,我们今天讨论的重点是如何快速的批量创建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秒。

 

 

 

 

 

posted @ 2020-04-10 16:38  忽然之间zz  阅读(583)  评论(0)    收藏  举报