Terraform引用azuredevops_projects项目ID时提示属性值类型错误
报错原因
报错本质是参数传入值的类型、字段都和资源要求不匹配:
- 类型不匹配:
azuredevops_git_repository数据源的project_id参数要求传入单个字符串格式的项目ID,但你写的[for obj in data.azuredevops_projects.sampleproject.projects : obj.name]是方括号包裹的for表达式,返回值是列表类型(也就是报错提示里的「包含1个元素的对象集合」),和参数要求的字符串类型完全不符。 - 字段取值错误:就算把列表转成单个值,你取的是
obj.name也就是项目的显示名称,而project_id参数要求传入项目的唯一GUID标识,传项目名本身也不符合参数定义。
修复方案
你用azuredevops_projects数据源时已经通过name = "sample"做了精确匹配,正常只会返回1个符合条件的项目,直接取返回集合第一个元素的id字段赋值即可,修正后的配置如下:
data "azuredevops_projects" "sampleproject"{ name = "sample" } data "azuredevops_git_repository" "samplerepo"{ project_id = data.azuredevops_projects.sampleproject.projects[0].id name = "Services-Template" } output "projectdetails"{ value = [for obj in data.azuredevops_projects.sampleproject.projects : obj.name] }
额外注意事项
- 所有被方括号
[]包裹的for表达式,返回值永远是列表/集合类型,只要参数要求传入单个值,就不能直接传入这类表达式结果,需要通过索引取值、或者逻辑判断拿到单个元素后再传入 - Azure DevOps Terraform 提供者中,所有带
_id后缀的参数,均要求传入对应资源的唯一标识符(GUID格式),不要传入资源的显示名称 - 如果担心名称匹配不到项目导致索引越界,可以添加前置校验规则,在计划阶段就明确提示匹配结果不符合预期,避免模糊报错
内容的提问来源于stack exchange,提问作者anu aggarwal
相关产品推荐
相关产品推荐

