如何使用 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