插值语法中的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
相同长度的字符串?
答案 0 :(得分:5)
当前的interpolate function timestamp()
已在源代码中以输出格式RFC3339
进行了硬编码:
https://github.com/hashicorp/terraform/blob/master/config/interpolate_funcs.go#L1521
返回时间。Now()。UTC()。Format(time.RFC3339),无
所以您的方式没有错,但是我们可以对其进行一些改进。
locals {
timestamp = "${timestamp()}"
timestamp_sanitized = "${replace("${local.timestamp}", "/[-| |T|Z|:]/", "")}"
}
参考:
https://github.com/google/re2/wiki/Syntax
replace(string,search,replace)-在给定的字符串上进行搜索和替换。搜索的所有实例都将替换为replace的值。如果搜索用正斜杠包装,则将其视为正则表达式。如果使用正则表达式,则replace可以通过使用$ n引用正则表达式中的子捕获,其中n是子捕获的索引或名称。如果使用正则表达式,则语法符合re2正则表达式语法。
答案 1 :(得分:2)
此答案仅显示了@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
答案 2 :(得分:0)
Terraform 0.12.0引入了一个新功能formatdate
,可以使此功能更具可读性:
output "timestamp" {
value = formatdate("YYYYMMDDhhmmss", timestamp())
}
在撰写本文时,formatdate
的最小支持单位是整秒,因此这不会产生与regexp方法完全相同的结果,但是如果最接近的秒数对于用例。