Terraform timestamp () для строки только цифры - PullRequest
0 голосов
/ 07 февраля 2019

Функция timestamp() в синтаксисе интерполяции возвращает строку в формате ISO 8601, которая выглядит следующим образом 2019-02-06T23:22:28Z.Тем не менее, я хочу иметь строку, которая выглядит следующим образом 20190206232240706500000001.Строка с только числами (целыми числами) и без дефисов, пробелов, двоеточий, Z или T. Каков простой и элегантный способ добиться этого?

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

locals {
  timestamp = "${timestamp()}"
  timestamp_no_hyphens = "${replace("${local.timestamp}", "-", "")}"
  timestamp_no_spaces = "${replace("${local.timestamp_no_hyphens}", " ", "")}"
  timestamp_no_t = "${replace("${local.timestamp_no_spaces}", "T", "")}"
  timestamp_no_z = "${replace("${local.timestamp_no_t}", "Z", "")}"
  timestamp_no_colons = "${replace("${local.timestamp_no_z}", ":", "")}"
  timestamp_sanitized = "${local.timestamp_no_colons}"
}

output "timestamp" {
  value = "${local.timestamp_sanitized}"
}

Результирующий вывод в нужном формате, за исключением того, что строка значительно короче:

Outputs:

timestamp = 20190207000744

Однако это решениеочень некрасиво.Есть ли другой способ сделать то же самое более элегантным способом, а также создать строку такой же длины, как в примере строки 20190206232240706500000001?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Этот ответ просто показывает пример ответа @ BMW, который не был очевиден для новичка в Terraform.

$ cat main.tf
locals {
  timestamp = "${timestamp()}"
  timestamp_sanitized = "${replace("${local.timestamp}", "/[-| |T|Z|:]/", "")}"

}

output "timestamp" {
  value = "${local.timestamp_sanitized}"
}

Пример прогонов

Прогон № 1:

$ terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

timestamp = 20190221205825

Прогон № 2:

$ terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

timestamp = 20190221205839
0 голосов
/ 21 мая 2019

Terraform 0.12.0 представила новую функцию formatdate, которая может сделать это более читабельным:

output "timestamp" {
  value = formatdate("YYYYMMDDhhmmss", timestamp())
}

На момент написания наименьшая поддерживаемая единица formatdateцелые секунды, так что это не даст тот же результат, что и подход регулярного выражения, но может работать, если ближайшая секунда достаточно точна для варианта использования.

0 голосов
/ 07 февраля 2019

Текущая интерполированная функция timestamp() была жестко закодирована с выходным форматом RFC3339 в исходном коде:

https://github.com/hashicorp/terraform/blob/master/config/interpolate_funcs.go#L1521

время возврата.Now (). UTC (). Формат (time.RFC3339), ноль

Так что в вашем пути нет ничего плохого, однако мы можем его немного улучшить.

locals {
  timestamp = "${timestamp()}"
  timestamp_sanitized = "${replace("${local.timestamp}", "/[-| |T|Z|:]/", "")}"

}

Ссылка:

https://github.com/google/re2/wiki/Syntax

replace (строка, поиск, замена) - выполняет поиск и замену по заданной строке.Все экземпляры поиска заменяются значением замены.Если поиск заключен в косую черту, он рассматривается как регулярное выражение.Если используется регулярное выражение, replace может ссылаться на подзаголовки в регулярном выражении с помощью $ n, где n - индекс или имя подзаголовка.При использовании регулярного выражения синтаксис соответствует синтаксису регулярного выражения re2 .

...