14

插值语法中的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

4

3 回答 3

29

Terraform 0.12.0 引入了一个新函数formatdate,可以使它更具可读性:

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

在撰写本文时,formatdate支持的最小单位是整秒,因此这不会给出与正则表达式方法完全相同的结果,但如果最近的秒对于用例来说足够准确,则可以工作。

于 2019-05-21T18:55:12.887 回答
11

当前的插值函数timestamp()RFC3339在源代码中使用输出格式进行了硬编码:

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

返回 time.Now().UTC().Format(time.RFC3339),nil

所以你的方式没有问题,但是我们可以稍微改进一下。

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

}

参考:

https://github.com/google/re2/wiki/语法

replace(string, search, replace) - 对给定的字符串进行搜索和替换。所有的 search 实例都被替换为 replace 的值。如果搜索包含在正斜杠中,则将其视为正则表达式。如果使用正则表达式,replace 可以使用 $n 引用正则表达式中的子捕获,其中 n 是子捕获的索引或名称。如果使用正则表达式,则语法符合 re2 正则表达式语法

于 2019-02-07T00:31:49.530 回答
3

这个答案只是显示了@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
于 2019-02-21T20:59:29.683 回答