Terraform 如何获取当前控制器到任意父目录的相对路径?

Terraform 如何获取当前控制器到任意父目录的相对路径?,terraform,Terraform,这不是一个模块,只是一个工作区 文件夹结构: workspace1 - workspace2 - workspace3 - workspace4 - workspace5 如果我将CD放入工作区,则完整路径为:/Users/me/my files/terraform/workspace1/workspace3/workspace4 如何使用terraform函数仅获取路径workspace1/workspace3/workspace4 有没有一种方法可以

这不是一个模块,只是一个工作区

文件夹结构:

workspace1
    - workspace2
    - workspace3
        - workspace4
    - workspace5
如果我将CD放入工作区,则完整路径为:/Users/me/my files/terraform/workspace1/workspace3/workspace4

如何使用terraform函数仅获取路径workspace1/workspace3/workspace4

有没有一种方法可以让我得到完整的路径,然后在工作空间1之前修剪掉所有东西?也许你能做到?在最新的tf版本中有更多的功能,尽管我想检查一下,没有一个功能可以让我在文档中找不到

# trying to use capture groups doesnt seem to work (just outputs full path)
locals {
  test = replace(
    abspath(path.root),
    "/(.*)(workspace1.*)",
    "$2"
  )
}
output "test" { value = "${local.test}" 
编辑此匹配项应该可以工作,但不支持:

      test = replace(
        abspath(path.root),
        "/.+?(?=workspace1)/",
        "$1"
unsupported Perl syntax: `(?=`.

我想我的语法错了:

#Folder structure
#workspace1
#    - workspace2
#    - workspace3
#        - workspace4
#    - workspace5

#abs path on disk: /Users/me/my-files/terraform/workspace1/workspace3/workspace4

locals {
  test = replace(
    abspath(path.root),
    "/.+?(workspace1.*)/",
    "$1"
  )
}
output "test" { value = "${local.test}" }

我想我的语法错了:

#Folder structure
#workspace1
#    - workspace2
#    - workspace3
#        - workspace4
#    - workspace5

#abs path on disk: /Users/me/my-files/terraform/workspace1/workspace3/workspace4

locals {
  test = replace(
    abspath(path.root),
    "/.+?(workspace1.*)/",
    "$1"
  )
}
output "test" { value = "${local.test}" }

假设没有像符号链接这样的复杂情况使问题变得更有趣,也许您可以通过在path.module和从那里到代码基根的相对路径上使用abspath来实现,然后使用后者的长度来修剪前者。例如:

locals {
  module_path        = abspath(path.module)
  codebase_root_path = abspath("${path.module}/../..")

  # Trim local.codebase_root_path and one additional slash from local.module_path
  module_rel_path    = substr(local.module_path, length(local.codebase_root_path)+1, length(local.module_path))
}

在上面,我假设当前模块是代码基根下的两个嵌套级别,并使用它来发现代码基根的绝对路径,以便将其从绝对模块路径中删除。

假设没有任何像符号链接这样的复杂情况使问题更有趣,也许您可以在path.module和从那里到您的代码基根的相对路径上使用abspath,然后使用后者的长度来修剪前者。例如:

locals {
  module_path        = abspath(path.module)
  codebase_root_path = abspath("${path.module}/../..")

  # Trim local.codebase_root_path and one additional slash from local.module_path
  module_rel_path    = substr(local.module_path, length(local.codebase_root_path)+1, length(local.module_path))
}
在上面,我假设当前模块是代码基根下的两个嵌套级别,并使用它来发现代码基根的绝对路径,以便将其从绝对模块路径中删除