Terraform timestamp()仅用于数字字符串
插值语法中的函数将返回ISO 8601格式的字符串,如下所示Terraform timestamp()仅用于数字字符串,terraform,hcl,Terraform,Hcl,插值语法中的函数将返回ISO 8601格式的字符串,如下所示2019-02-06T23:22:28Z。但是,我想要一个字符串,看起来像这样2019020623224070650000001。只有数字(整数)且没有连字符、空格、冒号、Z或T的字符串。实现这一点的简单而优雅的方法是什么 如果我在使用连字符、空格、冒号Z和T时将每个字符替换为单个字符类,则它会起作用: locals { timestamp = "${timestamp()}" timestamp_no_hyphens = "$
2019-02-06T23:22:28Z
。但是,我想要一个字符串,看起来像这样2019020623224070650000001
。只有数字(整数)且没有连字符、空格、冒号、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
然而,这种解决方案非常丑陋。是否有其他方法可以更优雅地完成同样的事情,并生成与示例字符串长度相同的字符串2019020623224070650000001
?在源代码中,当前已使用输出格式RFC3339
硬编码:
返回时间.Now().UTC().Format(time.rfc339),无
所以你的方式没有问题,不过我们可以稍微改进一下
locals {
timestamp = "${timestamp()}"
timestamp_sanitized = "${replace("${local.timestamp}", "/[- TZ:]/", "")}"
}
参考:
替换(字符串,搜索,替换)-对给定字符串执行搜索和替换。所有搜索实例都替换为replace的值。如果搜索以正斜杠包装,它将被视为正则表达式。如果使用正则表达式,replace可以使用$n引用正则表达式中的子类别,其中n是子类别的索引或名称。如果使用正则表达式,语法符合re2正则表达式语法
这个答案只是展示了@BMW的答案的一个例子,对于一个新加入Terraform的人来说,这个答案并不明显
$ cat main.tf
locals {
timestamp = "${timestamp()}"
timestamp_sanitized = "${replace("${local.timestamp}", "/[-| |T|Z|:]/", "")}"
}
output "timestamp" {
value = "${local.timestamp_sanitized}"
}
示例运行
运行#1:
运行#2:
Terraform 0.12.0引入了一个新功能,使其更具可读性:
output "timestamp" {
value = formatdate("YYYYMMDDhhmmss", timestamp())
}
在撰写本文时,
formatdate
支持的最小单位是整秒,因此这不会给出与regexp方法完全相同的结果,但如果最接近的秒对于用例来说足够精确,则可以工作。您能解释管道符号的作用吗?这只是re2语法中的还是。建议学习一些正则表达式教程,这样你就可以很容易地理解这些字符的用法。正则表达式语法有不同的变体。Re2可能是确定性有限自动机(DFA)和正则语言最具学术性的版本。|
符号在re2语法中的意思只不过是或。但是,不太清楚的是Terraformreplace
方法会替换正则表达式字符串的任何匹配项。/
用于指示正则表达式的开头,而[]
将搜索词组合在一起。对[-|T | Z |::]
的书面解释是搜索出现的任何单破折号-
或单空格``或单T
或单Z
或单冒号:
并将其替换为空“
@Jeepler或任何可能来过这里的人,[-| T | Z:]
不正确,因为方括号内的管道符号不能作为或
使用,并且将与字符|
匹配。方括号内的字符集已经是choose any,所以您只需要[-TZ::]
,这意味着您不需要|
。这应该被标记为答案,因为0.12I支持这一点。我尝试过这一点,它每次都生成相同的时间戳,而不是实时的,您知道为什么吗?
$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
timestamp = 20190221205839
output "timestamp" {
value = formatdate("YYYYMMDDhhmmss", timestamp())
}