添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
逆袭的甘蔗  ·  java ...·  1 年前    · 
私奔的数据线  ·  SQL Server-errors for ...·  2 年前    · 

作为 Azure 云资源管理员,在配置新环境时,通常需要创建多个 Azure 资源。 在从脚本自动创建 Azure 资源时,你可能还具有最适合的 Azure 资源审批过程。

在本文中,你将了解以下各项:

  • 从从带分隔符的 CSV 文件收到的参数创建多个 Azure 资源。
  • 使用 IF..THEN 语句来创建依赖的 Azure 资源。
  • 将脚本进度记录到本地 TXT 文件。
  • 此示例脚本在 Azure Cloud Shell 中使用 Bash 和 PowerShell 环境以及 PowerShell 7 进行测试。 在 Azure-samples/azure-cli-samples 中找到 CSV 和完整脚本。

    准备好你的环境

    按照以下步骤准备环境以运行示例脚本:

  • Azure Cloud Shell 中打开 Bash 或 PowerShell 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门

  • 将以下 CSV 文件下载并保存到本地目录。 将第三行中的 myExistingResourceGroupName 替换为实际的资源组名称。

    resourceNo,location,createRG,exstingRgName,createVnet,vnetAddressPrefix,subnetAddressPrefixes,vmImage,publicIpSku,Adminuser
    1,eastus,TRUE,,TRUE,10.0.0.0/16,10.0.0.0/24,Ubuntu2204,standard,
    2,eastus2,TRUE,,FALSE,,,Debian11,standard,alex-smith
    3,southcentralus,FALSE,myExistingResourceGroupName,FALSE,,,Ubuntu2204,standard,jan-smith
    [empty line for Bash]
    

    要成为正确的 Unix 文本文件并可由 Bash 读取,CSV 文件需要最后一行数据行末尾的换行符。 这将导致文件末尾的空白行。 空白行不需要说 [empty line],因为此文本仅用于显示空行存在。 PowerShell 环境没有此换行符要求。

  • 将修改后的 CSV 文件上传到 Azure Cloud Shell 博客存储帐户。 执行此作的最简单方法是使用 Azure Cloud Shell 主菜单上的 “管理文件 ”下拉列表。 有关 Cloud Shell 存储的详细信息,请参阅 Azure Cloud Shell 中的持久保存文件

    本文将单个大型脚本分为四个部分,允许解释每个步骤。

  • Azure 资源创建
  • 还提供了两个脚本:一个用于 Bash,另一个用于 PowerShell。 这两个脚本使用相同的 Azure CLI 命令。 不同的是环境或终端配置文件。 例如,Bash 使用 do...doneif...then...fi。 在 PowerShell 环境中,使用等效的 foreachif (something is true)...{do this}。 在 Azure Cloud Shell 中,可以使用 “切换到 PowerShell ”或“ 切换到 Bash ”按钮在 Azure Cloud Shell 主菜单中切换环境。

    如果愿意,请直接转到本文在 Azure-samples/azure-cli-samples 中使用的 CSV 和脚本文件。

    首先为脚本创建必要的变量。 以下三个变量需要环境的实际值:

    subscriptionID:这是 Azure 订阅 ID。
  • csvFileLocation :这是 CSV 输入文件的位置和文件名。 logFileLocation :这是 脚本用于创建日志文件 的位置和文件名。 无需创建或上传此文件。

    具有 msdocs- 前缀的变量可以替换为所选的前缀。 所有空 ( "" ) 变量都使用 CSV 输入文件中的值。 这些空变量充当脚本所需的占位符。

    # Replace these three variable values with actual values subscriptionID=00000000-0000-0000-0000-00000000 csvFileLocation="myFilePath\myFileName.csv" logFileLocation="myFilePath\myLogName.txt" # Variable values that contain a prefix can be replaced with the prefix of your choice. # These prefixes have a random ID appended to them in the script. # Variable values without a prefix will be overwritten by the contents of your CSV file. location="" createRG="" newRgName="msdocs-rg-" existingRgName="" createVnet="" vnetName="msdocs-vnet-" subnetName="msdocs-subnet-" vnetAddressPrefix="" subnetAddressPrefixes="" vmName="msdocs-vm-" vmImage="" publicIpSku="" adminUser="" adminPassword="msdocs-PW-@" # Set your Azure subscription az account set --subscription $subscriptionID
    # Variable block
    # Replace these three variable values with actual values
    $subscriptionID = "00000000-0000-0000-0000-00000000"
    $csvFileLocation = "myFilePath\myFileName.csv"
    $logFileLocation = "myFilePath\myLogName.txt"
    # Variable values that contain a prefix can be replaced with the prefix of your choice.
    #   These prefixes have a random ID appended to them in the script.
    # Variable values without a prefix will be overwritten by the contents of your CSV file.
    $location=""
    $createRG=""
    $newRgName="msdocs-rg-"
    $existingRgName=""
    $createVnet=""
    $vnetName="msdocs-vnet-"
    $subnetName="msdocs-subnet-"
    $vnetAddressPrefix=""
    $subnetAddressPrefixes=""
    $vmName="msdocs-vm-"
    $vmImage=""
    $publicIpSku=""
    $adminUser=""
    $adminPassword="msdocs-PW-@"
    # Set your azure subscription 
    az account set --subscription $subscriptionID
    # Import your CSV data
    $data = Import-Csv $csvFileLocation -delimiter ","
    

    验证 CSV 文件值

    在开始测试脚本之前,请确保 CSV 文件的格式正确,并为变量分配正确的值。 此脚本使用 IF..THEN 声明,以便您逐个查看方案/CSV 行。

    # Validate select CSV row values while IFS=, read -r resourceNo location createRG existingRgName createVnet vnetAddressPrefix subnetAddressPrefixes vmImage publicIpSku adminUser # Generate a random ID let "randomIdentifier=$RANDOM*$RANDOM" # Return the values for the first data row # Change the $resourceNo to check different scenarios in your CSV if [ "$resourceNo" = "1" ]; then echo "resourceNo = $resourceNo" echo "location = $location" echo "randomIdentifier = $randomIdentifier" echo "" echo "RESOURCE GROUP INFORMATION:" echo "createRG = $createRG" if [ "$createRG" = "TRUE" ]; then echo "newRGName = $newRgName$randomIdentifier" echo "exsitingRgName = $existingRgName" echo "" echo "VNET INFORMATION:" echo "createVnet = $createVnet" if [ "$createVnet" = "TRUE" ]; then echo "vnetName = $vnetName$randomIdentifier" echo "subnetName = $subnetName$randomIdentifier" echo "vnetAddressPrefix = $vnetAddressPrefix" echo "subnetAddressPrefixes = $subnetAddressPrefixes" echo "" echo "VM INFORMATION:" echo "vmName = $vmName$randomIdentifier" echo "vmImage = $vmImage" echo "vmSku = $publicIpSku" if [ `expr length "$adminUser"` == "1" ]; then echo "SSH keys will be generated." echo "vmAdminUser = $adminUser" echo "vmAdminPassword = $adminPassword$randomIdentifier" # skip the header line done < <(tail -n +2 $csvFileLocation)
    # Verify CSV columns are being read correctly
    # Take a look at the CSV contents
    # The returned table is restricted by the width of your terminal window
    $data | Format-Table
    # Validate select CSV row values
    foreach ($row in $data) {
      $resourceNo = $row.resourceNo
      $location = $row.location
      $createRG = $row.createRG
      $existingRgName = $row.existingRgName
      $createVnet = $row.createVnet
      $vnetAddressPrefix = $row.vnetAddressPrefix
      $subnetAddressPrefixes = $row.subnetAddressPrefixes
      $vmImage = $row.vmImage
      $publicIpSku = $row.publicIpSku
      $adminUser = $row.adminUser
      # Generate a random ID
      $randomIdentifier = (New-Guid).ToString().Substring(0,8)
      # Return the values for the first data row
      # Change the $resourceNo to check different scenarios in your CSV
      if ($resourceNo -eq "1") {
        Write-Host "resourceNo = $resourceNo"
        Write-Host "location = $location"
        Write-Host "randomIdentifier = $randomIdentifier"
        Write-Host ""
        Write-Host "RESOURCE GROUP INFORMATION:"
        Write-Host "createRG = $createRG"
        if ($createRG -eq "TRUE") {
          Write-Host "newRGName = $newRgName$randomIdentifier"
        else {
            Write-Host "exsitingRgName = $existingRgName"
        Write-Host ""
        Write-Host "VNET INFORMATION:"
        Write-Host "createVnet = $createVnet"
        if ($createVnet -eq "TRUE") {
          Write-Host "vnetName = $vnetName$randomIdentifier"
          Write-Host "subnetName = $subnetName$randomIdentifier"
          Write-Host "vnetAddressPrefix = $vnetAddressPrefix"
          Write-Host "subnetAddressPrefixes = $subnetAddressPrefixes"
        Write-Host ""
        Write-Host "VM INFORMATION:"
        Write-Host "vmName = $vmName$randomIdentifier"
        Write-Host "vmImage = $vmImage"
        Write-Host "vmSku= $publicIpSku"
        if ($adminUser -ne "") {
          Write-Host "vmAdminUser = $adminUser"
          Write-Host "vmAdminPassword = $adminPassword$randomIdentifier"
        else {
          Write-Host "SSH keys will be generated."
    vnetName = msdocs-vnet-00000001
    subnetName = msdocs-subnet-00000001
    vnetAddressPrefix = 10.0.0.0/16
    subnetAddressPrefix = 10.0.0.0/24
    VM INFORMATION:
    vmName = msdocs-vm-00000001
    vmImage = Ubuntu2204
    vmSku = standard
    SSH keys will be created
    

    验证脚本逻辑

    如果你对脚本功能有信心,则可以跳过此步骤。 但是,由于此脚本旨在大规模创建 Azure 资源,因此循环访问包含 echowrite-host 语句的脚本可以节省时间和意外的计费 Azure 资源。

    # Loop through each row in the CSV file while IFS=, read -r resourceNo location createRG existingRgName createVnet vnetAddressPrefix subnetAddressPrefixes vmImage publicIpSku adminUser # Generate a random ID let "randomIdentifier=$RANDOM*$RANDOM" # Log resource number and random ID echo "resourceNo = $resourceNo">>$logFileLocation echo "randomIdentifier = $randomIdentifier">>$logFileLocation # Check if a new resource group should be created if [ "$createRG" == "TRUE" ]; then echo "Will create RG $newRgName$randomIdentifier.">>$logFileLocation existingRgName=$newRgName$randomIdentifier # Check if a new virtual network should be created, then create the VM if [ "$createVnet" == "TRUE" ]; then echo "Will create VNet $vnetName$randomIdentifier in RG $existingRgName.">>$logFileLocation echo "Will create VM $vmName$randomIdentifier in Vnet $vnetName$randomIdentifier in RG $existingRgName.">>$logFileLocation echo "Will create VM $vmName$randomIdentifier in RG $existingRgName.">>$logFileLocation # Skip the header line. done < <(tail -n +2 $csvFileLocation) # Clear the console and display the log file Clear cat $logFileLocation
    # Validate script logic
    # Create the log file
    "SCRIPT LOGIC VALIDATION." | Out-File -FilePath $logFileLocation
    # Loop through each row in the CSV file
    foreach ($row in $data) {
      $resourceNo = $row.resourceNo
      $location = $row.location
      $createRG = $row.createRG
      $existingRgName = $row.existingRgName
      $createVnet = $row.createVnet
      $vnetAddressPrefix = $row.vnetAddressPrefix
      $subnetAddressPrefixes = $row.subnetAddressPrefixes
      $vmImage = $row.vmImage
      $publicIpSku = $row.publicIpSku
      $adminUser = $row.adminUser
      # Generate a random ID
      $randomIdentifier = (New-Guid).ToString().Substring(0,8)
      # Log resource number and random ID
      "" | Out-File -FilePath $logFileLocation -Append
      "resourceNo = $resourceNo" | Out-File -FilePath $logFileLocation -Append
      "randomIdentifier = $randomIdentifier" | Out-File -FilePath $logFileLocation -Append
      # Check if a new resource group should be created
      if ($createRG -eq "TRUE") {
        "Will create RG $newRgName$randomIdentifier." | Out-File -FilePath $logFileLocation -Append
        $existingRgName = "$newRgName$randomIdentifier"
      # Check if a new virtual network should be created, then create the VM
      if ($createVnet -eq "TRUE") {
        "Will create VNet $vnetName$randomIdentifier in RG $existingRgName." | Out-File -FilePath $logFileLocation -Append
        "Will create VM $vmName$randomIdentifier in VNet $vnetName$randomIdentifier in RG $existingRgName." | Out-File -FilePath $logFileLocation -Append
      } else {
        "Will create VM $vmName$randomIdentifier in RG $existingRgName." | Out-File -FilePath $logFileLocation -Append
    # Display the log file
    Get-Content -Path $logFileLocation
    

    使用本文中提供的 CSV,验证输出如下所示:( 00000001, 2, 3 每个测试的随机 ID 不同,但每个 resourceNo 资源应共享相同的随机 ID。

    resourceNo = 1
    createRG = TRUE
    createVnet = TRUE
    Will create RG msdocs-rg-00000001
    Will create VNet msdocs-vnet-00000001 in RG msdocs-rg-00000001
    Will create VM msdocs-vm-00000001 within Vnet msdocs-vnet-00000001 in RG msdocs-rg-00000001
    resourceNo = 2
    createRG = TRUE
    createVnet = FALSE
    Will create RG msdocs-rg-00000002
    Will create VM msdocs-vm-00000002 without Vnet in RG msdocs-rg-00000002
    resourceNo = 3
    createRG = FALSE
    createVnet = FALSE
    Will create VM msdocs-vm-00000003 without Vnet in RG <myExistingResourceGroup>
    

    创建 Azure 资源

    你创建了变量块,验证了 CSV 值,并完成了使用 echowrite-host 的测试运行。 执行脚本的第四部分和最后一部分,以创建 CSV 输入文件中定义的 Azure 资源。

    # Loop through each CSV row while IFS=, read -r resourceNo location createRG existingRgName createVnet vnetAddressPrefix subnetAddressPrefixes vmImage publicIpSku adminUser # Generate a random ID let "randomIdentifier=$RANDOM*$RANDOM" # Log resource number, random ID and display start time echo "resourceNo = $resourceNo">>$logFileLocation echo "randomIdentifier = $randomIdentifier">>$logFileLocation echo "Starting creation of resourceNo $resourceNo at $(date +"%Y-%m-%d %T")." # Check if a new resource group should be created if [ "$createRG" == "TRUE" ]; then echo "Creating RG $newRgName$randomIdentifier at $(date +"%Y-%m-%d %T").">>$logFileLocation az group create --location $location --name $newRgName$randomIdentifier >>$logFileLocation existingRgName=$newRgName$randomIdentifier echo " RG $newRgName$randomIdentifier creation complete" # Check if a new virtual network should be created, then create the VM if [ "$createVnet" == "TRUE" ]; then echo "Creating VNet $vnetName$randomIdentifier in RG $existingRgName at $(date +"%Y-%m-%d %T").">>$logFileLocation az network vnet create \ --name $vnetName$randomIdentifier \ --resource-group $existingRgName \ --address-prefix $vnetAddressPrefix \ --subnet-name $subnetName$randomIdentifier \ --subnet-prefixes $subnetAddressPrefixes >>$logFileLocation echo " VNet $vnetName$randomIdentifier creation complete" echo "Creating VM $vmName$randomIdentifier in Vnet $vnetName$randomIdentifier in RG $existingRgName at $(date +"%Y-%m-%d %T").">>$logFileLocation az vm create \ --resource-group $existingRgName \ --name $vmName$randomIdentifier \ --image $vmImage \ --vnet-name $vnetName$randomIdentifier \ --subnet $subnetName$randomIdentifier \ --public-ip-sku $publicIpSku \ --generate-ssh-keys >>$logFileLocation echo " VM $vmName$randomIdentifier creation complete" echo "Creating VM $vmName$randomIdentifier in RG $existingRgName at $(date +"%Y-%m-%d %T").">>$logFileLocation az vm create \ --resource-group $existingRgName \ --name $vmName$randomIdentifier \ --image $vmImage \ --public-ip-sku $publicIpSku \ --admin-username $adminUser\ --admin-password $adminPassword$randomIdentifier >>$logFileLocation echo " VM $vmName$randomIdentifier creation complete" # skip the header line done < <(tail -n +2 $csvFileLocation) # Clear the console (optional) and display the log file # clear cat $logFileLocation

    在控制台输出中,是否缺少 CSV 文件中的最后一行? 此问题可能是最后一行之后缺少行继续符造成的。 若要解决此问题,请在 CSV 文件末尾添加一个空白行。

    # Create Azure resources
    # Create the log file
    "CREATE AZURE RESOURCES." | Out-File -FilePath $logFileLocation
    # Loop through each CSV row
    foreach ($row in $data) {
      $resourceNo = $row.resourceNo
      $location = $row.location
      $createRG = $row.createRG
      $existingRgName = $row.existingRgName
      $createVnet = $row.createVnet
      $vnetAddressPrefix = $row.vnetAddressPrefix
      $subnetAddressPrefixes = $row.subnetAddressPrefixes
      $vmImage = $row.vmImage
      $publicIpSku = $row.publicIpSku
      $adminUser = $row.adminUser
      # Generate a random ID
      $randomIdentifier = (New-Guid).ToString().Substring(0,8)
      # Log resource number, random ID and display start time
      "" | Out-File -FilePath $logFileLocation -Append
      "resourceNo = $resourceNo" | Out-File -FilePath $logFileLocation -Append
      "randomIdentifier = $randomIdentifier" | Out-File -FilePath $logFileLocation -Append
      Write-Host "Starting creation of resourceNo $resourceNo at $(Get-Date -format 'u')."
      # Check if a new resource group should be created
      if ($createRG -eq "TRUE") {
        "Creating RG $newRgName$randomIdentifier at $(Get-Date -format 'u')." | Out-File -FilePath $logFileLocation -Append
        az group create --location $location --name $newRgName$randomIdentifier | Out-File -FilePath $logFileLocation -Append
        $existingRgName = "$newRgName$randomIdentifier"
        Write-Host "  RG $newRgName$randomIdentifier creation complete."
      # Check if a new virtual network should be created, then create the VM
      if ($createVnet -eq "TRUE") {
        "Creating VNet $vnetName$randomIdentifier in RG $existingRgName at $(Get-Date -format 'u')." | Out-File -FilePath $logFileLocation -Append
        az network vnet create `
            --name $vnetName$randomIdentifier `
            --resource-group $existingRgName `
            --address-prefix $vnetAddressPrefix `
            --subnet-name $subnetName$randomIdentifier `
            --subnet-prefixes $subnetAddressPrefixes | Out-File -FilePath $logFileLocation -Append
        Write-Host "  VNet $vnetName$randomIdentifier creation complete."
        "Creating VM $vmName$randomIdentifier in Vnet $vnetName$randomIdentifier in RG $existingRgName at $(Get-Date -format 'u')." | Out-File -FilePath $logFileLocation -Append
        az vm create `
            --resource-group $existingRgName `
            --name $vmName$randomIdentifier `
            --image $vmImage `
            --vnet-name $vnetName$randomIdentifier `
            --subnet $subnetName$randomIdentifier `
            --public-ip-sku $publicIpSku `
            --generate-ssh-keys | Out-File -FilePath $logFileLocation -Append
        Write-Host "  VM $vmName$randomIdentifier creation complete." 
      } else {
        "Creating VM $vmName$randomIdentifier in RG $existingRgName at $(Get-Date -format 'u')." | Out-File -FilePath $logFileLocation -Append
        az vm create `
            --resource-group $existingRgName `
            --name $vmName$randomIdentifier `
            --image $vmImage `
            --public-ip-sku $publicIpSku `
            --admin-username $adminUser `
            --admin-password $adminPassword$randomIdentifier | Out-File -FilePath $logFileLocation -Append
        Write-Host "  VM $vmName$randomIdentifier creation complete."
    # Clear the console (optional) and display the log file
    # Clear-Host
    Get-Content -Path $logFileLocation
    

    日志文件读取 的控制台输出:

    Starting creation of resourceNo 1 at YYYY-MM-DD HH:MM:SS.
      RG msdocs-rg-00000001 creation complete
      VNet msdocs-vnet-00000001 creation complete
      VM msdocs-vm-00000001 creation complete
    Starting creation of resourceNo 2 at YYYY-MM-DD HH:MM:SS.
      RG msdocs-rg-00000002 creation complete
      VM msdocs-vm-00000002 creation complete
    Starting creation of resourceNo 3 at YYYY-MM-DD HH:MM:SS.
      VM msdocs-vm-00000003 creation complete
    

    日志文件内容应类似于以下输出:

    Starting creation of resourceNo 1 at YYYY-MM-DD HH:MM:SS.
      Creating RG msdocs-rg-00000001 at YYYY-MM-DD HH:MM:SS.
      Resource group create output
      Creating VNet msdocs-vnet-00000001 in RG msdocs-rg-000000001 at YYYY-MM-DD HH:MM:SS.
      VNet create output
      Creating VM msdocs-vm-00000001 in RG msdocs-rg-00000001 at YYYY-MM-DD HH:MM:SS.
      VM create output
    Starting creation of resourceNo 2 at YYYY-MM-DD HH:MM:SS.
      Creating RG msdocs-rg-00000002 at YYYY-MM-DD HH:MM:SS.
      Resource group create output
      Creating VM msdocs-vm-00000002 in RG msdocs-rg-00000002 at YYYY-MM-DD HH:MM:SS.
      VM create output
    Starting creation of resourceNo 3 at YYYY-MM-DD HH:MM:SS.
      Creating msdocs-vm-00000003 creation complete
      VM create output
    

    在 Bash 中,“创建 Azure 资源”步骤在步骤 1 后停止

    在 Ubuntu 22.04.3 LTS 和 Debian 版本 12(bookworm)中, 验证脚本逻辑 按预期工作,返回所有三个资源的结果。 但是, 创建 Azure 资源 会在创建第一个资源后停止。 此问题的一个可能原因是在步骤 1 中创建 VNet 需要几秒钟。 Ubuntu 和 Debian 都继续执行第二个资源,而无需等待 VNet 的完成。 你可以在等待中阅读有关此内容的详细信息 ,不会等待 while 循环中的进程完成 ,或者 等待任何进程在 bash 脚本中完成

    Bash 脚本忽略 IF 语句

    Bash 区分大小写。 单词 true 不相等 TRUEgreater than-gt,不是 >,而 equals==,不是 =。 确保 CSV 列值中没有排版错误或前导/尾随空格。

    变量值不会随每个循环而更改

    此问题通常由 CSV 文件中的额外空间引起。 CSV 文件中的行如下所示: column1,column2,column3 或者 column1,,column3,但根据习惯,可以轻松创建一个测试文件,其中包含每个逗号 column1, column2, column3后面的空格。 在 CSV 中有前导或尾随空格时,列值实际上是 <space>columnValue。 脚本逻辑 if [ "$columnName" = "columnValue" ] 返回“false”。 若要解决此问题,请删除 CSV 行中的所有前导空格和尾随空格。

    CIDR 表示法无效

    将错误地址前缀传递给 时,会收到 az network vnet create 错误。 在语句 echo 中,当地址前缀从视觉上看来正确时可能很困难。 若要排查从 CSV 读取的实际值问题,请尝试以下脚本:

    while IFS=, read -r resourceNo location createRG existingRgName createVnet vnetAddressPrefix subnetAddressPrefixes vmImage publicIpSku adminUser
        echo "resourceNo = $resourceNo"
        if [ "$createVnet" == "TRUE" ]; then
          startTest="abc"
          endTest="xyz"
          echo $startTest$vnetAddressPrefix$endTest
    done < <(tail -n +2 $setupFileLocation)
    

    如果结果看起来 xzy10.0.0.0 与预期不相同 abc10.0.0.0/24xyz,则 CSV 文件中可能存在隐藏字符或额外的逗号。 添加具有相同前缀值的测试列、重新排列 CSV 列,并在简单的记事本编辑器中复制/粘贴 CSV 内容。 在本文中,CSV 列的重新排列最终修复了错误。

    参数是预期需要的或必需的

    如果未提供必需的参数,或者出现拼写错误,导致 Azure CLI 错误分析引用命令,则会收到此错误。 使用脚本时,如果以下任何一项为 true,你也会收到此错误:

  • 缺少或不正确的行继续符。
  • 行继续符右侧有尾随空格。
  • 变量名称包含特殊字符,如短划线(-)。
  • 无效模板部署

    尝试在某个不提供该资源的区域创建 Azure 资源时,会收到如下错误信息:“由于容量限制,以下 SKU 无法使用:Standard_DS1_v2 当前在区域 'westus' 不可用。”

    下面是完整的错误示例:

    {"error":{"code":"InvalidTemplateDeployment","message":"The template deployment 'vm_deploy_<32 character ID>'
    is not valid according to the validation procedure. The tracking id is '<36 character ID>'.
    See inner errors for details.","details":[{"code":"SkuNotAvailable","message":"The requested VM size for resource
    'Following SKUs have failed for Capacity Restrictions: Standard_DS1_v2' is currently not available
    in location '<your specified location>'. Please try another size or deploy to a different location
    or different zone. See https://aka.ms/azureskunotavailable for details."}]}}
    

    若要更正错误,请更改位置或选择为所需位置提供的其他参数值。

    大规模删除 Azure 资源