Terraform - 如何输出多个值
Terraform - How to output multiple value
我对 Terraform 和编程还很陌生,但是,我必须提高自己的技能,因此非常感谢您提供正确的 output.tf 文件的建议。
在我的main.tf里,我写了:
terraform {
required_version = ">=0.12"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>2.0"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "RG1" {
name = "AZ-VNET"
location = var.resource_group_location
}
resource "azurerm_resource_group" "RG2" {
name = "AZ-Migrate"
location = var.resource_group_location
}
在我的 output.tf 我写道:
output "resource_group_name" {
value = azurerm_resource_group.RG*.name
}
结果没有打印两个资源组名称。
你可以在一个输出中有多个资源,但要让它工作,你需要使用一些terraform函数,或者根据类型格式化输出,如果它是一个列表,字符串,映射..当你有机会,看看 https://www.terraform.io/language/functions -- 我将展示一个例子,你将有一个 ID 列表。
1 - 顺便说一句,我们不能像通配符一样在字符串中使用 *,* 主要用于处理模块、动态资源或输出列表的资源,但在任何情况下在这种情况下,在资源名称中放置 * 将不起作用。我们在资源的属性之前使用 *
,假设我们有一个创建 ABC
资源的模块,并且该资源具有 id
属性。它将是 module.ABC.*.id
- 但它并不适用于所有情况,您需要知道输出的类型是什么,如果它是字符串、列表、映射,就像我说的那样。
3 - 我不使用 Azure,但如果你在 https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group 上查看该资源的文档 - 你可以看到从该资源导出的唯一属性是 id
。鉴于此,您可以执行以下操作:
output "resource_group_name" {
value = [azurerm_resource_group.RG1.id, azurerm_resource_group.RG2.id]
}
现在假设你真的需要输出这些资源的名称,你可以创建locals
块来定义资源的名称,然后你就可以导出它们查询locals
值,例如:
locals {
azurerm_resource_group_rg1 = "AZ-VNET"
azurerm_resource_group_rg2 = "AZ-Migrate"
}
resource "azurerm_resource_group" "RG1" {
name = local.azurerm_resource_group_rg1
location = var.resource_group_location
}
resource "azurerm_resource_group" "RG2" {
name = local.azurerm_resource_group_rg2
location = var.resource_group_location
}
输出为:
output "resource_group_name" {
value = [local.azurerm_resource_group_rg1, local.azurerm_resource_group_rg2]
}
但是现在不要那样做,我不知道他们是否会被重新创建,我不知道这些资源。如果你擅长这个,就这样做吧。
如果你知道了请告诉我。
我对 Terraform 和编程还很陌生,但是,我必须提高自己的技能,因此非常感谢您提供正确的 output.tf 文件的建议。
在我的main.tf里,我写了:
terraform {
required_version = ">=0.12"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>2.0"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "RG1" {
name = "AZ-VNET"
location = var.resource_group_location
}
resource "azurerm_resource_group" "RG2" {
name = "AZ-Migrate"
location = var.resource_group_location
}
在我的 output.tf 我写道:
output "resource_group_name" {
value = azurerm_resource_group.RG*.name
}
结果没有打印两个资源组名称。
你可以在一个输出中有多个资源,但要让它工作,你需要使用一些terraform函数,或者根据类型格式化输出,如果它是一个列表,字符串,映射..当你有机会,看看 https://www.terraform.io/language/functions -- 我将展示一个例子,你将有一个 ID 列表。
1 - 顺便说一句,我们不能像通配符一样在字符串中使用 *,* 主要用于处理模块、动态资源或输出列表的资源,但在任何情况下在这种情况下,在资源名称中放置 * 将不起作用。我们在资源的属性之前使用 *
,假设我们有一个创建 ABC
资源的模块,并且该资源具有 id
属性。它将是 module.ABC.*.id
- 但它并不适用于所有情况,您需要知道输出的类型是什么,如果它是字符串、列表、映射,就像我说的那样。
3 - 我不使用 Azure,但如果你在 https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group 上查看该资源的文档 - 你可以看到从该资源导出的唯一属性是 id
。鉴于此,您可以执行以下操作:
output "resource_group_name" {
value = [azurerm_resource_group.RG1.id, azurerm_resource_group.RG2.id]
}
现在假设你真的需要输出这些资源的名称,你可以创建locals
块来定义资源的名称,然后你就可以导出它们查询locals
值,例如:
locals {
azurerm_resource_group_rg1 = "AZ-VNET"
azurerm_resource_group_rg2 = "AZ-Migrate"
}
resource "azurerm_resource_group" "RG1" {
name = local.azurerm_resource_group_rg1
location = var.resource_group_location
}
resource "azurerm_resource_group" "RG2" {
name = local.azurerm_resource_group_rg2
location = var.resource_group_location
}
输出为:
output "resource_group_name" {
value = [local.azurerm_resource_group_rg1, local.azurerm_resource_group_rg2]
}
但是现在不要那样做,我不知道他们是否会被重新创建,我不知道这些资源。如果你擅长这个,就这样做吧。
如果你知道了请告诉我。