【问题标题】:Terraform Data Source MeaningTerraform 数据源含义
【发布时间】:2018-09-20 12:02:32
【问题描述】:

我是 Terraform 的新手,正在尝试了解 数据源。我已经阅读了documentation 和这个 StackOverflow post,但我仍然不清楚数据源的用例。

我有以下代码块:

resource "azurerm_resource_group" "rg" {
  name     = "example-resource-group"
  location = "West US 2"
}


data "azurerm_resource_group" "test" {
  name = "example-resource-group"
}

但我收到 404 错误:

  • data.azurerm_resource_group.test:data.azurerm_resource_group.test:resources.GroupsClient#Get:响应请求失败: StatusCode=404 -- 原始错误:autorest/azure:服务返回一个 错误。状态=404 代码="ResourceGroupNotFound" 消息="资源组 找不到“示例资源组”。”

我不明白为什么找不到资源组。另外,我不清楚 datavariable 之间的区别以及何时应该使用哪个。

谢谢

【问题讨论】:

    标签: terraform terraform-provider-azure


    【解决方案1】:

    我已在此SO answer 中详细说明了数据源是什么。总结一下:

    • 数据源提供有关当前 Terraform 配置未管理的实体的动态信息
    • 变量提供静态信息

    您的代码块不起作用,因为您的数据源引用的资源尚未创建。在规划阶段,Terraform 将尝试查找名为 example-resource-group 的资源组,但找不到,因此中止了整个运行。块的顺序对它们的应用顺序没有影响。

    如果您删除data 块,运行terraform apply,然后然后重新添加data 块,它应该可以工作。但是,数据源用于检索有关不受 Terraform 配置管理的实体的数据。在您的情况下,您不需要 data.azurerm_resource_group.test 数据源,您可以简单地使用资源中的 exported attributes。在azurerm_resource_group 的情况下,这是a single id attribute

    【讨论】:

    • @d4nynyll 您的回答很好,但我认为您有一个错误 - 您在“exported_attributes”部分中附加了输出链接。据我所知,这是两个完全不同的实体。
    • @Rotemya 然后澄清一下 - 每个模块都使用一个 output 块来导出属性。从链接 - '由 Terraform 管理的资源实例每个 export attributes 其值可以在配置中的其他地方使用。如果您能找到更好的链接,请随时更新它:)
    【解决方案2】:

    将数据源视为您想从其他地方读取的值。

    变量是你在运行代码时定义的东西。

    当您将data source 用于azurerm_resource_group 时,terraform 将搜索具有您在数据源块中定义的名称的现有资源。

    示例

        data "azurerm_resource_group" "test" {
          name = "example-resource-group"
        }
    

    从下面的评论中引用@ydaetskcoR 关于 404 错误:

    这是 404ing 因为数据源在资源之前运行 创建您正在寻找的东西。您将使用数据源 当资源之前已经创建过,不在同一个 作为您正在创建的资源运行。

    【讨论】:

    • 感谢您的帮助。我已经更新了这个问题。鉴于我的 azurerm_resource_group“资源”位于 azurerm_resource_group“数据”之上,我仍然会收到 404 错误
    • 404 可能是因为 terraform 在创建资源之前调用了它。也许分享一个代码示例?您不必使用数据源,如果您需要知道值,您可以访问资源的响应。
    • 这是 404ing,因为数据源在资源创建您要查找的内容之前正在运行。当资源之前已经创建时,您将使用数据源,而不是与您正在创建的资源在同一运行中。 terraform.io/docs/providers/azurerm/d/resource_group.html 中的示例提供了一个很好的示例,其中资源组先前已在另一个 Terraform 上下文中创建(或可能完全由另一个进程创建),但您想知道创建另一个资源的资源组位置。
    猜你喜欢
    • 2020-07-08
    • 2019-12-20
    • 2017-06-11
    • 1970-01-01
    • 2021-12-28
    • 2023-03-07
    • 2021-11-20
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多