【问题标题】:Vnet creation task skip the task if it is run onceVnet 创建任务如果运行一次则跳过该任务
【发布时间】:2019-12-26 05:38:36
【问题描述】:

我正在为 AKS 构建 ci/cd 管道。第一个任务集是“Azure 资源组部署”,用于为 AKS 创建 vnet /subnet。
由于 vnet 和子网已经就位,因此打算下次跳过该任务。第二次开始出现以下错误-

BadRequest: { "error": { "code": "InUseSubnetCannotBeDeleted", "message": "Subnet AKSSubnet is in use by /subscriptions/***************************************/resourceGroups/MC_**************-CLUSTER_eastus/providers/Microsoft.Network/networkInterfaces/aks-agentpool-
########-nic-0/ipConfigurations/ipconfig1 and cannot be deleted. In order to delete the subnet, delete all the resources within the subnet. See aka.ms/deletesubnet.", "details": [] } }  
Error:  Task failed while creating or updating the template deployment. 

看起来该任务正在尝试删除子网而不是跳过它。分辨率是多少?

它使用以下 arm 模板:azuredeploy.json

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vnetName": {
      "type": "string",
      "defaultValue": "GEN-VNET-NAME",
      "metadata": {
        "description": "Name of the virtual Network"
      }
    },
    "vnetAddressPrefix": {
      "type": "string",
      "defaultValue": "10.10.0.0/16",
      "metadata": {
        "description": "Address prefix"
      }
    },
    "subnetPrefix": {
      "type": "string",
      "defaultValue": "10.10.0.0/24",
      "metadata": {
        "description": "Subnet Prefix"
      }
    },
    "subnetName": {
      "type": "string",
      "defaultValue": "Subnet",
      "metadata": {
        "description": "GEN-SUBNET-NAME"
      }
    }
  },
  "variables": {},
  "resources": [
    {
      "apiVersion": "2018-06-01",
      "type": "Microsoft.Network/virtualNetworks",
      "name": "[parameters('vnetName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[parameters('vnetAddressPrefix')]"
          ]
        }
      },
      "resources": [
        {
          "apiVersion": "2018-06-01",
          "type": "subnets",
          "location": "[resourceGroup().location]",
          "name": "[parameters('subnetName')]",
          "dependsOn": [
            "[parameters('vnetName')]"
          ],
          "properties": {
            "addressPrefix": "[parameters('subnetPrefix')]"
          }
        }
      ]
    }
  ],
  "outputs": {
    "vnetName": {
      "type": "string",
      "value": "[parameters('vnetName')]"
    },
    "subnetName": {
      "type": "string",
      "value": "[parameters('subnetName')]"
    }
  }
}

azuredeploy.parameters.json

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vnetName": {
      "value": "###########"
    },
    "vnetAddressPrefix": {
      "value": "10.10.0.0/16"
    },
    "subnetPrefix": {
      "value": "10.10.0.0/24"
    },
    "subnetName": {
      "value": "######"
    }
  }
}

【问题讨论】:

  • 你能澄清一下你运行任务的条件是什么吗?即总是运行它?或者你有条件吗?您正在使用任务的哪个“动作”?请注意,您可能正在使用 Azure 模板的“增量模式”,它们将确保跳过不需要再次运行的内容(例如,如果创建了资源并且它处于您的所需状态,则不受任务执行的影响)。
  • 这是误导,部署模式无关紧要,它并没有真正跳过资源,如果没有什么要更新的,它只是不更新​​它们,本质上它调用了api,但是因为有无需进行任何更改 - 什么都没有发生
  • @luca cappa 使用了增量模式。如错误所示,它仍然尝试删除现有子网,然后可能会尝试构建子网。

标签: azure azure-devops azure-pipelines


【解决方案1】:

这里发生了什么 - 你的模板是这样编码的:

vnet resources
  empty subnets property
subnet resource(s)
bla-bla-bla

由于您创建模板的方式,这里正在尝试强制 vnet 拥有 0 个子网。你有两个选择:

  1. 在 vnet 资源定义上设置一个条件,并在构建号大于 1 时向其传递一个参数(或者只是在构建时手动指定是否跳过它)。
  2. 将您的模板修改为如下所示:
vnet resource
  subnets property populated with subnets
bla-bla-bla

本质上,这与 Azure Devops 无关。

【讨论】:

  • 更新了用于 vnet /subnet 创建的 json。不知道哪里出错了..
  • 您并没有真正改变任何东西,因为您仍然使用 vnets 下的资源,而不是子网属性。看看proper way 这样做
  • 我检查了链接,但不清楚如何设置内部版本号的变量以跳过未​​来的构建运行。非常感谢任何见解/帮助
  • 它不会,它只是不会破坏它们(您的子网)。如果您可以确保您的第一个构建 id 始终相同(通过将其传递给 arm 模板并在 vnet 资源上使用条件),您可以找到一种实现跳过的方法
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
相关资源
最近更新 更多