【问题标题】:Terraform to split the input before provisioningTerraform 在配置之前拆分输入
【发布时间】:2021-11-20 10:11:15
【问题描述】:

我正在使用 terraform 创建存储库。 git repo 输入作为列表传递给 terraform.tfvars,如下所示

repo_list = ["Test-Repo1","Dev-Repo2","Prod_Repo3"]

我正在使用以下配置语言来配置存储库

resource "azuredevops_git_repository" "test" {
  count = length(var.repo_list )
  project_id = azuredevops_project.proj.id
  name       = var.repo_list[count.index]
  initialization {
  init_type = "Clean"
 }
}

通过上述配置,我可以使用 repo_list 中给出的名称来配置 repo。但我希望使用分隔符“-”来拆分 repo 名称。因此,如果我给出“Test-Repo4”,那么我应该能够拆分它并将值“Repo4”传递给上述配置,并且应该创建 Repo4。但根据当前设置,将创建 Test-Repo4 存储库。

我是 Terraform 的新手。所以准备根据建议重组我的代码。我使用“ENV_REPO”的原因是因为我正在根据这个值在批处理脚本中执行严肃的功能

【问题讨论】:

    标签: azure-devops terraform


    【解决方案1】:

    你应该使用 split 函数然后 element 函数来选择合适的值。请检查下面的sn-p:

    resource "azuredevops_git_repository" "test" {
      count = length(var.repo_list )
      project_id = azuredevops_project.proj.id
      name       = "${element(split("-", var.repo_list[count.index]), 1)}"
      initialization {
      init_type = "Clean"
     }
    }
    

    【讨论】:

    • 谢谢@Krzysztof,您的解决方案完美运行。仅据我所知,我如何在这里使用 terraform locals?
    • 您可以像使用变量一样使用局部变量。只需使用local.some_name
    【解决方案2】:

    作为已接受答案的替代方案(两者都是有效的!),如果您知道您的姓名将总是这样分为两部分,并且这两部分各有固定的含义,那么您可以使用the regex function 将它们解压缩成一张地图,这可能会使未来的读者更清楚地了解含义:

    locals {
      repositories = tomap({
        for name in var.repo_list :
        name => regex("^(?P<environment>\\w)-(?P<repository>\\w)$")
      })
    }
    
    resource "azuredevops_git_repository" "test" {
      for_each = local.repositories
    
      project_id = azuredevops_project.proj.id
      name       = each.value.repository
      initialization {
        init_type = "Clean"
      }
    }
    

    此正则表达式模式使用命名捕获组,因此结果将是一个映射,其键是捕获组名称。对于您的输入(假设您打算对所有三个示例使用 - 分隔符)local.repositories 将是:

    tomap({
      Test-Repo1 = tomap({
        environment = "Test"
        repository  = "Repo1"
      })
      Dev-Repo2 = tomap({
        environment = "Dev"
        repository  = "Repo2"
      })
      Prod-Repo3 = tomap({
        environment = "Prod"
        repository  = "Repo3"
      })
    })
    

    我在这里的权衡是,当在配置的其他地方提到这个时,我宁愿看到.environment.repository,而不是[0][1],这样意图更容易理解。但是,这确实是以可能难以阅读的非平凡正则表达式模式为代价的,因此我认为只有在您不太可能经常引用或维护该正则表达式模式时才值得这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2012-05-12
      相关资源
      最近更新 更多