Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform timestamp()仅用于数字字符串_Terraform_Hcl - Fatal编程技术网

Terraform timestamp()仅用于数字字符串

Terraform timestamp()仅用于数字字符串,terraform,hcl,Terraform,Hcl,插值语法中的函数将返回ISO 8601格式的字符串,如下所示2019-02-06T23:22:28Z。但是,我想要一个字符串,看起来像这样2019020623224070650000001。只有数字(整数)且没有连字符、空格、冒号、Z或T的字符串。实现这一点的简单而优雅的方法是什么 如果我在使用连字符、空格、冒号Z和T时将每个字符替换为单个字符类,则它会起作用: locals { timestamp = "${timestamp()}" timestamp_no_hyphens = "$

插值语法中的函数将返回ISO 8601格式的字符串,如下所示
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语法中的意思只不过是
。但是,不太清楚的是Terraform
replace
方法会替换正则表达式字符串的任何匹配项。
/
用于指示正则表达式的开头,而
[]
将搜索词组合在一起。对
[-|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())
}