gpt4 book ai didi

azure - 如何从另一个模块中的模块获取值 - Terraform (Azure)

转载 作者:行者123 更新时间:2023-12-03 06:35:23 25 4
gpt4 key购买 nike

我试图从一个模块中获取值(value)并在另一个模块中使用它。

我有模块 - vnet

resource "azurerm_virtual_network" "vnet" {
name = var.vnet_name
resource_group_name = var.resource_group_name
location = var.location
address_space = var.address_space
}

resource "azurerm_subnet" "subnet" {
name = "${var.vnet_name}-subnet"
resource_group_name = var.resource_group_name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = var.subnet_prefixes
}

并且输出是:

output "subnet_id" {
value = "${azurerm_subnet.subnet.id}"
}

output "vnet_name" {
value = "${azurerm_virtual_network.vnet.name}"
}

从这个模块中,我想获取我用来创建网卡的其他模块的 vnet 名称和子网 ID。

网卡模块

module "vnet" {
source = "../vnet"
}


resource "azurerm_network_interface" "nic" {
name = "${module.vnet.vnet_name}-nic"
location = "east us 2"
resource_group_name = "null"

ip_configuration {
name = " "
subnet_id = module.vnet.subnet_id
private_ip_address_allocation = "Dynamic"
}
}

这种方式有效,但是 terraform 计划,计划为每个资源创建 2 个资源,因为我使用的是获取值的方式。

在 nic 模块下,我再次使用 vnet 模块,因此它将创建第二个 vnet。

我的ma​​in.tf

resource "azurerm_resource_group" "rg" {
name = var.resource_group.name
location = var.resource_group.location
}

module "ib151w-vnet" {
source = "./modules/vnet"
resource_group_name = azurerm_resource_group.rg.name
vnet_name = "ib151w-vnet"
address_space = var.address_space
subnet_prefixes = var.subnet_prefixes
}

module "ib151w-nic" {
source = "./modules/nic"
name = "nic-test-123"
location = "east us 2"
resource_group_name = "ib151w"
}

问题是如何获取要在 nic 模块内使用的 vnet 名称和子网 ID?

i know there is alot of better ways to establish my request but imjust learning terraform and trying this specific way :)

最佳答案

how can i get the vnet name and subnet id to use inside the nic module

您必须在根模块中显式传递这些值:

module "ib151w-nic" {
source = "./modules/nic"
name = "nic-test-123"
location = "east us 2"
resource_group_name = "ib151w"

vnet_name = module.vnet.vnet_name
subnet_id = module.vnet.subnet_id
}

此外,您还必须修改 vnet 模块以使 vnet 和子实体有条件。例如,在 vent 模块中添加变量:

variable "should_create_vnet_and_subnet" {
default = true
}

然后将资源设为条件:

resource "azurerm_virtual_network" "vnet" {

count = should_create_vnet_and_subnet == true ? 1 : 0

name = var.vnet_name
resource_group_name = var.resource_group_name
location = var.location
address_space = var.address_space
}

resource "azurerm_subnet" "subnet" {

count = should_create_vnet_and_subnet == true ? 1 : 0

name = "${var.vnet_name}-subnet"
resource_group_name = var.resource_group_name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = var.subnet_prefixes
}

还有其余的。基本上,您必须围绕条件资源重写整个 vnet 模块。

关于azure - 如何从另一个模块中的模块获取值 - Terraform (Azure),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74927144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com