在Terraform中使用IP地址作为属性名称进行导入

45次阅读
没有评论

问题描述

在使用Terraform管理Fortigate设备时,需要从Terraform管理的设备生成terraform.tfstate文件。在使用Terraform输出和自定义脚本生成tf.address.tf.json输出文件后,希望能够按照输出的属性名称导入对象。

具体而言,用户有一个tf.address.tf.json文件,其结构如下:

{
  "resource": {
    "fortios_firewall_address": {
      "11.0.0.0/8": {
        // 其他属性
      }
    }
  }
}

用户尝试执行以下命令进行导入:

$ terraform import fortios_firewall_address.11_0_0_0/8 "11.0.0.0/8"

但是该命令产生了如下错误:

Error: Attribute name required
   on <import-address> line 1:
    1: fortios_firewall_address.11_0_0_0/8
Dot must be followed by attribute name.

用户认为可能需要将属性名称更改为类似”ADDRESS-11_0_0_0M8″的格式,但想知道是否有其他方法可以在Terraform的导入中使用名称”fortios_firewall_address.11_0_0_0/8″。

解决方案

请注意以下操作可能受到Terraform版本差异的影响。

在Terraform中,资源的名称必须是有效的标识符,有效的标识符只能以字母和下划线开头,不能以数字开头。因此,您遇到的问题并不特定于terraform import命令,而是Terraform语言的一般规则。

对于您的情况,如果想在导入中使用名称”fortios_firewall_address.11_0_0_0/8″,您可以考虑以下解决方案:

方案1:更改属性名称

您已经提到,将属性名称更改为遵循有效标识符的命名规则可能是一种方法。例如,您可以使用类似”ADDRESS_11_0_0_0_8″的命名。

方案2:使用terraform.tf文件进行映射

另一种方法是在Terraform配置中使用terraform.tf文件,将输入的属性名称映射到有效的资源名称。以下是一个示例terraform.tf文件的内容:

provider "your_provider" {
  # 配置提供者
}

# 使用属性名称映射到有效的资源名称
resource "fortios_firewall_address" "ADDRESS_11_0_0_0_8" {
  # 配置资源
}

在上面的示例中,我们使用fortios_firewall_address资源,但为其定义了一个名为ADDRESS_11_0_0_0_8的资源块,以匹配输入的属性名称。这样,您可以使用terraform apply命令将资源的名称与有效的标识符匹配起来。

请注意,无论选择哪种方法,都需要在Terraform配置中明确指定属性名称与资源名称之间的映射关系,以确保Terraform可以正确识别和管理资源。

无论您选择哪种解决方案,都应该根据您的具体需求进行调整和实施。

正文完