如何使用 Azure Devops 将 powershell 列表变量传输到 terraform?

Posted

技术标签:

【中文标题】如何使用 Azure Devops 将 powershell 列表变量传输到 terraform?【英文标题】:How to transfer a powershell list variable to terraform by using Azure Devops? 【发布时间】:2020-09-12 00:02:01 【问题描述】:

我有一个列表,其中包含地址前缀,例如 192.168.1.0/24

$listOfSubnetsToBeCreated = @() 
Write-Host "##vso[task.setvariable variable=availableSubnetList]$listOfSubnetsToBeCreated"

在 powershell 中创建并转移到我已经在 Azure Devops 中定义的 azure devops 管道变量。 我正在使用这个在运行时设置的变量

terraform apply -var="availableSubnetList=$(availableSubnetList)" 

在我的 Terraform 任务中创建子网。下面是 tf 脚本:

variable "availableSubnetList" 
  type = list(string)
  default = [""]

resource "azurerm_subnet" "Subnet-lab" 
    count = var.project_subnet_number
    name = join("-", ["$var.LabRGName","subnet", "$count.index + 1"])
    resource_group_name = var.AdminRGName
    virtual_network_name = var.lab_vnet
    address_prefix = var.availableSubnetList[count.index]

当我执行管道时,terraform apply 任务出现以下错误:

2020-05-25T14:39:52.5509261Z [0m  on <value for var.availableSubnetList> line 1:
2020-05-25T14:39:52.5510090Z   (source code not available)
2020-05-25T14:39:52.5510378Z 
2020-05-25T14:39:52.5510814Z This character is not used within the language.
2020-05-25T14:39:52.5511149Z [0m[0m
2020-05-25T14:39:52.5511412Z [31m
2020-05-25T14:39:52.5512135Z [1m[31mError: [0m[0m[1mInvalid expression[0m
2020-05-25T14:39:52.5512438Z 
2020-05-25T14:39:52.5512833Z [0m  on <value for var.availableSubnetList> line 1:
2020-05-25T14:39:52.5513301Z   (source code not available)
2020-05-25T14:39:52.5513582Z 
2020-05-25T14:39:52.5513977Z Expected the start of an expression, but found an invalid expression token.
2020-05-25T14:39:52.5514566Z [0m[0m

Afaik,Azure Devops 中的变量是字符串。您对如何使用 Azure Devops 将 powershell 列表正确传输到 terraform 有任何想法吗?

【问题讨论】:

【参考方案1】:

从 PowerShell 脚本中输出一个逗号分隔的子网字符串:

Write-Host "##vso[task.setvariable variable=availableSubnetList]$($listOfSubnetsToBeCreated -join ',')"

然后在调用terraform的时候再拆分成一个列表:

terraform apply -var='availableSubnetList=$split(",", $(availableSubnetList))'

或者改变你在 terraform 中解析每个子网的方式:

address_prefix = split(",", var.availableSubnetList)[count.index]

【讨论】:

我已应用它并收到此错误:2020-05-25T12:21:07.2672860Z [1m[31mError: [0m[0m[1mInvalid reference[0m 2020-05-25T12:21:07.2674089] Z 2020-05-25T12:21:07.2675081Z [0m on network.tf line 8, in resource "azurerm_subnet" "Subnet-lab": 2020-05-25T12:21:07.2676095Z 8: address_prefix = [4mavailableSubnetList[0m[ count.index] 2020-05-25T12:21:07.2676984Z [0m 2020-05-25T12:21:07.2700114ZA 对资源类型的引用必须后跟至少一个属性 2020-05-25T12:21:07.2701181Z 访问,指定资源名称。 这里的 $(availableSubnetList) 在日志中似乎是空的:terraform.exe 计划 -var=LabRGName=rg-deniztest3-87719dccbe -var=project_subnet_number=3 "-var=availableSubnetList=$split( ,, )" 虽然我输入 -var="availableSubnetList=$split(",", $(availableSubnetList))" 我注意到我在 tf 脚本中犯了一个错误:address_prefix = availableSubnetList[count.index]。它应该是 var.availableSubnetList[count.index] @MoonHorse 我不确定$split() 表达式在命令行中是否有效,您可能需要在任务本身中执行此操作 @MoonHorse 太好了(抱歉,我无法为 tf 提供更多帮助,而不是我的强项)。我已经更新了我的答案以反映您的解决方案:)

以上是关于如何使用 Azure Devops 将 powershell 列表变量传输到 terraform?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Azure Policy 与 Azure DevOps 集成?

作业终止后如何将生成的文件从 Azure Databricks 导出到 Azure DevOps?

如何使用 Azure 自动化运行手册将 Azure devops 存储库下载为 zip 文件?

如何从 azure blob 存储中获取 json 数据并使用 azure 数据工厂将其发送到 power apps dataverse

如何使用 Azure Devops 将 powershell 列表变量传输到 terraform?

如何将Azure DevOps中的代码发布到Azure App Service中