Terraform 如何将输出从一个模块传递到另一个模块?

Terraform 如何将输出从一个模块传递到另一个模块?,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,我有两个模块 一个称为模块azure vnet 第二个名为模块azure vm实例zabbix proxy 我想将模块模块azure vnet的输出传递到模块模块azure vm实例zabbix代理。第一个模块工作正常,但第二个模块需要输入子网、安全组和路由 main.tf module "module-azure-vnet-dtap" { source = "/Users/username/project/module-azure-vnet-dtap" } variable "subne

我有两个模块

  • 一个称为
    模块azure vnet
  • 第二个名为
    模块azure vm实例zabbix proxy
  • 我想将模块
    模块azure vnet的输出传递到模块
    模块azure vm实例zabbix代理
    。第一个模块工作正常,但第二个模块需要输入子网、安全组和路由

    main.tf

    module "module-azure-vnet-dtap" {
      source = "/Users/username/project/module-azure-vnet-dtap"
    }
    
    variable "subnets_id_wan" {}
    
    module "module-azure-vm-instance-zabbix-proxy" {
      source = "/Users/username/project/module-azure-vm-instance-zabbix-proxy"
      azurerm_subnet = "${module.module-azure-vnet-dtap.azurerm_subnet.wan.id}"
    }
    
    错误:资源“azurerm\u网络\u接口。无\u公共\u ip”配置:变量azurerm\u subnet.wan.id中引用了未知资源“azurerm\u subnet.wan”

    错误:资源“azurerm\u网络\u安全\u规则.安全\u规则\u默认值”配置:变量azurerm\u网络\u安全\u组.wan.name中引用的未知资源“azurerm\u网络\u安全\u组.wan”

    错误:模块“模块azure vm实例zabbix代理”:“azurerm_子网”不是有效参数

    在模块中
    模块azure vnet dtap

    resource "azurerm_subnet" "wan" {
      count                     = "${var.enable_wan_subnet ? 1 : 0}"
      provider                  = "azurerm.base"
      name                      = "${format("%s-%s-%s", var.environment_name, "WAN", "Subnet")}"
      virtual_network_name      = "${azurerm_virtual_network.this.name}"
      resource_group_name       = "${azurerm_resource_group.this.name}"
      address_prefix            = "${cidrsubnet(var.cidr_block,5,count.index)}"
      route_table_id            = "${azurerm_route_table.wan.id}"
      network_security_group_id = "${azurerm_network_security_group.wan.id}"
    }
    
    resource "azurerm_network_security_group" "wan" {
      count               = "${var.enable_wan_subnet ? 1 : 0}"
      provider            = "azurerm.base"
      name                = "${format("%s-%s", var.environment_name, "WAN-Subnet-Security-Group")}"
      location            = "${azurerm_resource_group.this.location}"
      resource_group_name = "${azurerm_resource_group.this.name}"
    }
    
    output "subnets_id_wan" {
      value = "${azurerm_subnet.wan.*.id}"
    
      depends_on = [
        "azurerm_subnet.wan",
      ]
    }
    

    您应该像这样引用输出:

    "${module.MODULE_NAME.OUTPUT_NAME}"
    
    在您的情况下,它应该是:

    "${module.module-azure-vnet-dtap.subnets_id_wan}"
    

    此外,您只能访问输出,而不能访问模块中的资源(afaik)。

    我自己找到了解决方案,以下是连接两个模块所需的整个结构

    在VNET模块示例中设置变量:

    variable "resource_group_name" {
          default     = "default_resource_group"
          }
    
          variable "region_name" {
          default     = "ukwest"
          }
    
    声明输出:

    output "security_groups_id_wan" {
          value = "${element(concat(azurerm_network_security_group.wan.*.id, list("")),0)}"
    
            depends_on = [
              "azurerm_subnet.wan",
              ]
          }
    
    您需要zabbix代理模块中的变量才能接收>

    variable "resource_group_name" {
            default = ""
            }
            variable "resource_group_location" {
            default = ""
            } 
    
    在外部文件夹中,模块的main.tf>

    module "module-azure-vm-instance-zabbix-proxy" {
            source = "/Users/username/project/module-azure-vm-instance-zabbix-proxy"
            resource_group_name = "${module.module-azure-vnet-dtap.resource_group_name}"
            resource_group_location = "${module.module-azure-vnet-dtap.resource_group_location}"
            subnets_id_wan = "${module.module-azure-vnet-dtap.subnets_id_wan}"
            security_groups_name = "${module.module-azure-vnet-dtap.security_groups_name_dmz}"
            environment_name = "${module.module-azure-vnet-dtap.environment_name}"
          }
    
          module module-azure-vnet-dtap {
            source = "/Users/username/project/module-azure-vnet-dtap"
          }
    

    您好,在将azurerm_subnet.wan.id更改为subnets_id_want尝试注释模块“模块azure vm实例zabbix代理”后出现相同错误
    block,然后运行
    terraform init&&terraform refresh&&terraform show | less
    ,查看所有输出名称和值,查看模块是否输出正确的值,或者是否将正确的输出传递给zabbix代理模块。