导入
虽然我们不期望对语法进行向后不兼容的更改,但-generate-config-out
标志以及 OpenTofu 在计划阶段处理导入和生成配置的方式可能会在将来的版本中发生变化。
使用import
块将现有基础设施资源导入 OpenTofu,并将它们置于 OpenTofu 的管理之下。与tofu import
命令不同,使用import
块进行的配置驱动的导入是可预测的,适用于 CI/CD 管道,并允许您在修改状态之前预览导入操作。
导入后,OpenTofu 会在您的状态文件中跟踪该资源。然后,您可以像管理任何其他资源一样管理导入的资源,更新其属性并在标准资源生命周期中将其销毁。
import
块记录 OpenTofu 导入了该资源,而不是创建了它。导入后,您可以选择从配置中删除导入块,或者将其保留为资源来源的记录。
语法
您可以将import
块添加到任何 OpenTofu 配置文件中。一种常见的模式是创建一个imports.tf
文件,或者将每个import
块放在它导入到的resource
块旁边。
import {
to = aws_instance.example
id = "i-abcd1234"
}
resource "aws_instance" "example" {
name = "hashi"
# (other resource arguments...)
}
上面的import
块定义了将 ID 为“i-abcd1234”的 AWS 实例导入到根模块中的aws_instance.example
资源。
import
块具有以下参数
to
- 此资源将在您的状态文件中具有的实例地址。id
- 包含资源的 导入 ID 的字符串。provider
(可选) - 可选的自定义资源提供程序,有关详细信息,请参阅 资源提供程序元参数。for_each
(可选) - 通过迭代映射或集合导入多个资源。请参阅下面的 导入多个资源。
如果您未设置provider
参数,则 OpenTofu 会尝试从默认提供程序导入。
导入 ID
导入块要求您使用资源的导入 ID 的文字字符串提供id
参数。OpenTofu 需要此导入 ID 来定位您要导入的资源。
您用于资源导入 ID 的标识符是特定于资源的。您可以在提供程序文档中找到您要导入的资源所需的 ID。
计划和应用导入
OpenTofu 在计划阶段处理import
块。一旦计划获得批准,OpenTofu 就会在随后的应用阶段将资源导入其状态。
要使用import
块导入资源,您必须
- 为资源定义一个
import
块。 - 将相应的
resource
块添加到您的配置中,或 为该资源生成配置。 - 运行
tofu plan
以查看 OpenTofu 将如何导入资源。 - 应用配置以导入资源并更新您的 OpenTofu 状态。
import
块是 幂等的,这意味着只要该资源保留在您的状态中,应用导入操作并运行另一个计划就不会生成另一个导入操作。
OpenTofu 只需要导入给定资源一次。尝试将资源再次导入到同一地址是一个无害的空操作。您可以在完成导入后删除import
块,或者安全地将其保留在配置中,作为资源来源的记录,供未来的模块维护者参考。有关随着时间的推移维护配置的更多信息,请参阅 重构。
资源配置
在导入之前,您必须为要 OpenTofu 导入的每个资源添加配置。否则,OpenTofu 会在计划期间抛出错误,坚持要求您在成功导入之前添加资源配置。您可以手动创建资源配置,或 使用 OpenTofu 生成它。
如果您知道大多数 资源的参数 将是什么,我们建议编写一个resource
块。例如,您的配置可能已经包含一个类似的资源,您可以复制并修改其配置。
我们建议在导入多个资源或单个复杂资源(您还没有其配置)时生成配置。
添加一个 resource
块
为要导入的资源添加一个 resource
块。资源地址必须与导入块的 to
参数匹配。
import {
to = aws_instance.example
id = "i-abcd1234"
}
resource "aws_instance" "example" {
name = "renderer"
}
生成配置
OpenTofu 可以为配置中尚不存在的资源生成 HCL。有关更多详细信息,请参阅生成配置。
示例
以下示例演示如何导入到模块中。
import {
to = module.instances.aws_instance.example
id = "i-abcd1234"
}
以下示例演示如何导入包含count
的资源。
import {
to = aws_instance.example[0]
id = "i-abcd1234"
}
以下示例演示如何导入包含for_each
的资源。
import {
to = aws_instance.example["foo"]
id = "i-abcd1234"
}
最后,以下示例演示如何从自定义资源提供程序导入。
provider "aws" {
alias = "europe"
region = "eu-west-1"
}
import {
provider = aws.europe
to = aws_instance.example["foo"]
id = "i-abcd1234"
}
导入多个资源
您可以使用 for_each
表达式在一个导入块中导入多个资源。此表达式接受集合、元组或映射,并提供 each.key
和 each.value
变量来访问各个元素。
在下面的示例中,您可以指定要导入的服务器 ID 列表。如果您指定空列表,则 random_id
资源将随机生成所有 ID。如果您指定了一些 ID,则导入块将导入指定的 ID,并且资源将随机生成其余 ID。请注意,random_id
资源要求 ID 为 Base64 格式。
variable "server_ids" {
type = list(string)
}
resource "random_id" "test_id" {
byte_length = 8
count = 2
}
import {
to = random_id.test_id[tonumber(each.key)]
id = each.value
for_each = {
for idx, item in var.server_ids: idx => item
}
}
output "id" {
value = random_id.test_id.*.b64_url
}
在 import
块上使用 for_each
时,目前生成配置不可用。