是否可以在 Azure DevOps 中创建遵循幂等原则的 PowerShell 任务

Is it possible to create PowerShell task in Azure DevOps which follow the principle of idempotent

我正在使用 Azure DevOps 和 PowerShell 任务并创建一个包含多个管道的构建。我创建了一个版本,它将按照任务序列在 Azure 中创建资源,使用顺序管道,例如,任务 1 创建资源组,任务 2 创建 Vnet 和子网,任务 3 创建存储,任务 4 创建虚拟机等等。我用 Terraform 做过类似的事情。但是在 AzureDevOps 中,当我尝试多次执行相同的构建时,我遇到了一个问题,它抛出资源已经存在的错误并且管道显示失败 运行,我不希望管道 运行 并且不做幂等操作。我们如何在 Azure DevOps 中实现这一目标?

幂等运算可以重复任意次数,结果与只执行一次相同。在算术中,给数字加零是幂等的。

对于您的问题,我了解到您想为要执行的每个操作创建任务。任务将是顺序的

您可以参考 Azure Yaml Schema 了解更多详情 https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-powershell?view=azure-devops#yaml-snippet

steps:
  - task: AzurePowerShell@5
    name: Create Resource Group Name
    inputs:
      azureSubscription: $(serviceConnection)
      Inline: |
        $rgO = Get-AzResourceGroup -name ${{ parameters.ResourceGroupname }} -location ${{ parameters.location }}
        if(!$$rgO)
        {
          New-AzResourceGroup -name ${{ parameters.ResourceGroupname }} -location ${{ parameters.location }}
        }

尝试使用 ARM 模板创建所有资源,然后使用 ARM template deployment 任务和 Deployment Mode = Incremental,然后您将实现您想要的。

ARM template example for VNET and 2 Subnets:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vnetName": {
      "type": "string",
      "defaultValue": "VNet1",
      "metadata": {
        "description": "VNet name"
      }
    },
    "vnetAddressPrefix": {
      "type": "string",
      "defaultValue": "10.0.0.0/16",
      "metadata": {
        "description": "Address prefix"
      }
    },
    "subnet1Prefix": {
      "type": "string",
      "defaultValue": "10.0.0.0/24",
      "metadata": {
        "description": "Subnet 1 Prefix"
      }
    },
    "subnet1Name": {
      "type": "string",
      "defaultValue": "Subnet1",
      "metadata": {
        "description": "Subnet 1 Name"
      }
    },
    "subnet2Prefix": {
      "type": "string",
      "defaultValue": "10.0.1.0/24",
      "metadata": {
        "description": "Subnet 2 Prefix"
      }
    },
    "subnet2Name": {
      "type": "string",
      "defaultValue": "Subnet2",
      "metadata": {
        "description": "Subnet 2 Name"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2020-05-01",
      "name": "[parameters('vnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[parameters('vnetAddressPrefix')]"
          ]
        }
      },
      "resources": [
        {
          "type": "subnets",
          "apiVersion": "2020-05-01",
          "location": "[parameters('location')]",
          "name": "[parameters('subnet1Name')]",
          "dependsOn": [
            "[parameters('vnetName')]"
          ],
          "properties": {
            "addressPrefix": "[parameters('subnet1Prefix')]"
          }
        },
        {
          "type": "subnets",
          "apiVersion": "2020-05-01",
          "location": "[parameters('location')]",
          "name": "[parameters('subnet2Name')]",
          "dependsOn": [
            "[parameters('vnetName')]",
            "[parameters('subnet1Name')]"
          ],
          "properties": {
            "addressPrefix": "[parameters('subnet2Prefix')]"
          }
        }
      ]
    }
  ]
}

发布管道任务(ARM部署任务https://github.com/microsoft/azure-pipelines-tasks/blob/master/Tasks/AzureResourceManagerTemplateDeploymentV3/README.md