【问题标题】:Provider requires dynamic output of resource: what to do?提供者需要资源的动态输出:怎么办?
【发布时间】:2022-06-30 04:45:59
【问题描述】:

我正在成功创建vmc_sddc 资源。从中返回的属性之一是“nsxt_reverse_proxy_url”。

我需要将“nsxt_reverse_proxy_url”值用于其他提供商的 (nsxt) 输入。

不幸的是,Terraform 拒绝了这个结构,说“必须提供主机名”。换句话说,不接受动态值作为输入。

问题:有没有办法将资源中动态创建的值用作另一个提供者的输入?

代码如下:

resource "vmc_sddc" "harpoon_sddc" {
  sddc_name           = var.sddc_name
  vpc_cidr            = var.vpc_cidr
  num_host            = 1
  provider_type       = "AWS"
  region              = data.vmc_customer_subnets.my_subnets.region
  vxlan_subnet        = var.vxlan_subnet
  delay_account_link  = false
  skip_creating_vxlan = false
  sso_domain          = "vmc.local"
  deployment_type     = "SingleAZ"
  sddc_type           = "1NODE"
}

provider "nsxt" {
  host                 = vmc_sddc.harpoon_sddc.nsxt_reverse_proxy_url // DOES NOT WORK
  vmc_token            = var.api_token
  allow_unverified_ssl = true
  enforcement_point    = "vmc-enforcementpoint"
}

这是来自 Terraform 的错误消息:

╷
│ Error: host must be provided
│ 
│   with provider["registry.terraform.io/vmware/nsxt"],
│   on main.tf line 55, in provider "nsxt":
│   55: provider "nsxt" {
│

谢谢

【问题讨论】:

标签: terraform terraform-provider-aws


【解决方案1】:

正如您所发现的,某些提供程序在规划期间无法将未知值作为其配置的一部分处理,因此以您尝试的方式根据在同一运行中创建的对象动态配置它们是行不通的。

在这种情况下,有两个主要选择:

  • 在您第一次运行时,您可以使用 terraform apply -target=vmc_sddc.harpoon_sddc 要求 Terraform 仅关注创建该对象所需的对象,不包括与 nsxt 提供程序相关的任何内容。一旦应用成功完成,您就可以正常运行terraform apply,Terraform 已经知道vmc_sddc.harpoon_sddc.nsxt_reverse_proxy_url 的值,因此提供程序配置可以成功。

    这通常是您不希望经常重新创建的长期配置的最佳选择,因为您可以在初始创建期间执行一次一次性额外步骤,然后照常使用 Terraform,只要你永远不需要重新创建vmc_sddc.harpoon_sddc

  • 您可以将配置拆分为两个单独的配置来处理不同的层。第一层将负责“vmc”抽象级别,允许您单独terraform apply,然后第二个配置将负责构建在顶部的“nsxt”抽象级别,您可以运行@ 987654327@ on 一旦你运行了第一个配置。

    这是第一个选项的变体,其中第一步和第二步之间的分离在配置结构本身中是明确的,这意味着您在运行 Terraform 时不需要添加任何额外的选项,但您现在需要管理两个配置。因此,只有在您定期销毁和重新创建这些对象时,这种方法才比第一种方法更好,这样您就可以在代码中明确说明这是一个两步过程。

原则上,一些提供者可以设计为允许未知值作为输入,并在这种情况下进行离线规划,但从技术上讲,并非所有提供者都可以这样做,因为有时在没有连接的情况下确实无法创建有意义的计划到远程系统向它提问。我不熟悉这个提供程序,所以我不知道它是否需要主机名是出于强大的技术原因,或者只是因为提供程序开发人员没有考虑到您可能会以这种方式使用它,所以如果您知道nsxt 让您认为原则上它可以进行离线规划,那么第三种选择是询问开发人员是否可以将连接到给定主机的时间推迟到应用阶段,在这种情况下您不需要像上面那样做任何额外的步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多