Terraform timestamp()只能为数字字符串

Jee*_*ler 4 terraform hcl

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}"
}
Run Code Online (Sandbox Code Playgroud)

结果输出采用所需格式,但字符串明显较短:

Outputs:

timestamp = 20190207000744
Run Code Online (Sandbox Code Playgroud)

但是,这种解决方案非常丑陋。还有另一种方式可以以更优雅的方式完成相同的事情,并产生与示例字符串相同长度的字符串20190206232240706500000001吗?

BMW*_*BMW 6

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

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

返回time.Now()。UTC()。Format(time.RFC3339),无

因此,您的方式没有错,但是我们可以对其进行一些改进。

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

}
Run Code Online (Sandbox Code Playgroud)

参考:

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

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

  • @Jeepler 或任何可能来这里的人,`[-| |T|Z|:]` 不正确,因为方括号内的管道符号不能充当“OR”,而是与字符“|”匹配。方括号内的字符集已经是任意选择,因此您只需要“[-TZ:]”,这意味着您不需要“|”。 (2认同)

slm*_*slm 6

这个答案只是显示了 @BMW 答案的一个例子,这对于 Terraform 的新手来说并不明显。

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

}

output "timestamp" {
  value = "${local.timestamp_sanitized}"
}
Run Code Online (Sandbox Code Playgroud)

运行示例

运行#1:

$ terraform apply

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

Outputs:

timestamp = 20190221205825
Run Code Online (Sandbox Code Playgroud)

运行#2:

$ terraform apply

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

Outputs:

timestamp = 20190221205839
Run Code Online (Sandbox Code Playgroud)


Mar*_*ins 5

Terraform 0.12.0引入了一个新功能formatdate,可以使此功能更具可读性:

output "timestamp" {
  value = formatdate("YYYYMMDDhhmmss", timestamp())
}
Run Code Online (Sandbox Code Playgroud)

在撰写本文时,formatdate支持的最小单位是整秒,因此这不会产生与regexp方法完全相同的结果,但是如果最接近的秒对于用例足够准确,则可以使用。