如何在Azure DevOps中参数化Terraform azurerm_role_definition的assignable_scopes
解决方案
问题根因
- 重复嵌套列表:你已经将
assignable_scopes_subs_ids变量声明为list类型,赋值时额外加了[]相当于把列表再套了一层,生成了二维列表,而azurerm_role_definition的assignable_scopes参数要求的是一维字符串列表,类型不匹配。 - 输入格式不匹配:你在Azure DevOps变量中输入的是带引号逗号分隔的字符串,不是Terraform能直接识别的列表类型,直接传入会触发类型校验错误。
修复步骤
步骤1:修改Terraform代码
首先修正变量定义和赋值逻辑,Terraform版本>=0.14时推荐明确指定变量类型为list(string),同时移除赋值时额外的[]:
# 修正变量定义 variable "assignable_scopes_subs_ids" { description = "Assignable scopes from Key Vault" type = list(string) default = [] } resource "azurerm_role_definition" "terraform_role_data_science" { name = "Data-Labeler" scope = data.azurerm_subscription.dev.id description = "Can label data for Labeling" permissions { actions = [ "Microsoft.MachineLearningServices/workspaces/read", "Microsoft.MachineLearningServices/workspaces/labeling/projects/read", "Microsoft.MachineLearningServices/workspaces/labeling/labels/write" ] not_actions = [ "Microsoft.MachineLearningServices/workspaces/labeling/projects/summary/read" ] } # 修正赋值:直接传入list类型变量,不需要额外套[] assignable_scopes = var.assignable_scopes_subs_ids }
步骤2:调整Azure DevOps变量传入方式
两种可行的参数传入方案二选一即可:
方案A:直接传入Terraform格式的列表
在Azure DevOps的Terraform任务变量中,直接按列表格式传入:
- 变量名:
assignable_scopes_subs_ids - 变量值:
["/subscriptions/****1","/subscriptions/****2","/subscriptions/****3"]
如果是通过命令行参数传入,格式为:terraform apply -var 'assignable_scopes_subs_ids=["/subscriptions/****1","/subscriptions/****2"]'
方案B:传入逗号分隔的字符串后在Terraform中解析
如果必须用逗号分隔的纯字符串格式输入,可以调整变量类型为string,用split函数解析成列表:
# 调整变量类型为string variable "assignable_scopes_subs_ids" { description = "Assignable scopes from Key Vault, comma separated string" type = string default = "" } # 赋值时解析字符串为列表 assignable_scopes = split(",", var.assignable_scopes_subs_ids)
对应的Azure DevOps变量值调整为不带引号的逗号分隔格式:/subscriptions/****1,/subscriptions/****2,/subscriptions/****3
内容的提问来源于stack exchange,提问作者Pirvu Georgian
相关产品推荐
相关产品推荐

