Как я могу получить относительный путь текущего директора до произвольного родительского каталога? - PullRequest
0 голосов
/ 08 января 2020

это не модуль, а просто рабочее пространство

структура папок:

workspace1
    - workspace2
    - workspace3
        - workspace4
    - workspace5

Если я записываю CD в рабочее пространство для полного пути: /Users/me/my-files/terraform/workspace1/workspace3/workspace4

Как могу ли я использовать функции terraform, чтобы получить только путь workspace1/workspace3/workspace4

Есть ли способ получить полный путь (https://www.terraform.io/docs/configuration/functions/abspath.html) и затем обрезать все перед рабочим пространством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: `(?=`.

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Предполагая, что нет никаких сложностей, таких как символические ссылки, чтобы сделать проблему более "интересной", возможно, вы могли бы сделать это, используя abspath как на path.module, так и на относительном пути оттуда к вашей кодовой базе root и затем используйте длину последнего, чтобы урезать первое. Например:

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))
}

. Выше я предполагаю, что текущий модуль находится на двух уровнях вложенности под кодовой базой root, и использую его для определения абсолютного пути кодовой базы root в порядке обрезать его по абсолютному пути модуля.

0 голосов
/ 08 января 2020

Это работает, я думаю, что у меня был неправильный синтаксис:

#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}" }
...