【发布时间】:2021-07-16 03:03:44
【问题描述】:
Terraform azurerm_image 数据源允许您使用正则表达式来识别其 ID 与正则表达式匹配的机器映像。
应该使用什么正则表达式来检索包含字符串
MyImageName并采用完整形式/subscriptions/abc-123-def-456-ghi-789-jkl/resourceGroups/MyResourceGroupName/providers/Microsoft.Compute/images/MyImageName1618954096的图像?
以下版本的 RegEx 引发错误,因为它不接受两个 * 字符。但是,当我们只使用结尾的* 时,图像并没有被检索到。
data "azurerm_image" "search" {
name_regex = "*MyImageName*"
resource_group_name = var.resourceGroupName
}
请注意,结果仅返回单个图像,因此您无需担心返回多个图像。可以设置一个标志来指定升序或降序排序以检索最旧或最新的匹配项。
我们得到的准确错误是:
Error: "name_regex": error parsing regexp: missing argument to repetition operator: `*`
尼克的建议
根据@Nick 的建议,我们尝试了:
data "azurerm_image" "search" {
name_regex = "/MyImageName[^/]+$"
resource_group_name =
var.resourceGroupName
}
但结果是:
Error: No Images were found for Resource Group "MyResourceGroupName"
我们在 Azure 门户中进行了检查,在名为 MyResourceGroupName 的资源组中存在一个名称中包含 MyImageName 的图像。我们还确认 Terraform 作为订阅所有者运行,因此我们假设订阅所有者有足够的权限来过滤图像名称。
我们还能尝试什么?
【问题讨论】:
-
*表示重复前一个字符 0 次或多次。在您的“正则表达式”中,您在第一个*之前没有字符,因此出现错误。您的第二个正则表达式不起作用,因为它与字符串MyImageNam后跟 0 个或多个es 匹配。你可能想要/MyImageName[^/]+$ -
@Nick 谢谢。我们刚刚将尝试您的建议的结果发布到了 OP 的末尾。还有什么想法吗?
-
如果正则表达式需要匹配整个名称,那么可能是
.+/MyImageName[^/]+?不幸的是,我看不到有关此参数的任何文档以提供更多线索。顺便说一句,您是否尝试输入确切的名称(作为name而不是name_regex)来检查是否匹配? -
@Nick 再次感谢您。您建议的更改会导致相同的错误。然后,当我们将我们从 Azure 门户手动复制的实际图像的整个资源 ID 粘贴在双引号
"..."中时,我们也遇到了同样的错误。 -
对不起,这超出了我对 terraform 的知识水平(也就是说,没有:)。我给你的正则表达式应该匹配名称字符串(例如参见regex101.com/r/mhNhVi/1)。我希望你能找到其他在 terraform 方面更专业的人来提供帮助。
标签: regex azure terraform virtual-machine azure-rm