是否可以在 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
我正在使用 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