对于terraform 0.12,如何从1.1.1.1/32这样的字符串中修剪ip前缀?

对于terraform 0.12,如何从1.1.1.1/32这样的字符串中修剪ip前缀?,terraform,Terraform,我得到了这个变量: variable "ip" { default = "1.1.1.1/32" } 在某些情况下,我需要完整的前缀:1.1.1.1/32,但有时我只需要ip SAN前缀:1.1.1.1 现在0.12有了这个新功能,我可以这样使用: trimsuffix(var.ip, "/32") 但是我不想像那样硬编码前缀。有没有一种方法可以删除正则表达式匹配的子字符串,或者干脆截断字符串的最后3个字符?我不能使用substr,因为它希望我知道字符串的完整长度 编辑:所以尝试使用正则

我得到了这个变量:

variable "ip" {
  default = "1.1.1.1/32"
}
在某些情况下,我需要完整的前缀:1.1.1.1/32,但有时我只需要ip SAN前缀:1.1.1.1

现在0.12有了这个新功能,我可以这样使用:

trimsuffix(var.ip, "/32")
但是我不想像那样硬编码前缀。有没有一种方法可以删除正则表达式匹配的子字符串,或者干脆截断字符串的最后3个字符?我不能使用substr,因为它希望我知道字符串的完整长度

编辑:所以尝试使用正则表达式来实现这一点,但不确定terraform是否支持完整的正则表达式

我得到一个错误:

> regex("^.+(?=\/)","11.1.1.1/32")

>
Error: Invalid escape sequence

  on <console-input> line 1:
  (source code not available)

The symbol "/" is not a valid escape sequence selector.
然后当我试图避开反斜杠时:

> regex("^.+(?=\\/)","11.1.1.1/32")

>
Error: Invalid function argument

  on <console-input> line 1:
  (source code not available)

Invalid value for "pattern" parameter: invalid regexp pattern: invalid or
unsupported Perl syntax in (?=.

如果您只想截断前缀以删除/32或任何其他任意前缀(如/16),则可以改用,只需将主机号指定为0即可获取网络地址:

$ terraform console
> cidrhost("192.168.0.0/16", 0)
192.168.0.0
> cidrhost("1.1.1.1/32", 0)
1.1.1.1
如果出于某种原因想使用regex,那么只需捕获/so.*/*之前的部分就可以用作搜索模式。返回捕获组的列表,因此您只需要第一个:

> regex("(.*)/.*", "192.168.0.0/16")[0]
192.168.0.0
> regex("(.*)/.*", "1.1.1.1/32")[0]
1.1.1.1

您希望192.168.0.0/16的输出结果是什么?192.168.0.0/16?您不能拥有可变类型的cidrhost,对吗?没有ip地址数据类型,对吗?我不确定我是否遵循。你能举个例子吗?你想用它做什么?强制某人只在CIDR符号中输入有效前缀?如果您真的愿意,您可能可以使用can实现这一点,但无论如何,它都会以一种合理可读的方式爆炸:调用函数cidrhost失败:无效的CIDR表达式:无效的CIDR地址:1.1.1。