导入使用
使用 tofu import
命令将现有基础设施导入 OpenTofu 状态。
tofu import
命令一次只能导入一个资源。它无法同时导入一整个资源集合,例如 AWS VPC。
OpenTofu 预期它管理的每个远程对象仅绑定到一个资源地址,这通常由 OpenTofu 本身创建所有对象来保证。如果您将现有对象导入 OpenTofu,请注意将每个远程对象仅导入到一个 OpenTofu 资源地址。如果您多次导入同一个对象,OpenTofu 可能表现出意外行为。有关此假设的更多信息,请参阅 状态部分。
要导入资源,首先在配置中为其编写资源块,建立它在 OpenTofu 中的名称
resource "aws_instance" "example" {
# ...instance configuration...
}
此处的名称“example”在声明它的模块中是本地的,由配置作者选择。这不同于远程系统发行的任何 ID,后者可能会随着时间的推移而发生变化,而资源名称保持不变。
如果需要,你现在可以将资源块的主体留空,并在导入实例后返回填写它。
现在可以运行 tofu import
将现有实例附加到此资源配置
$ tofu import aws_instance.example i-abcd1234
此命令找到 ID 为 i-abcd1234
的 AWS EC2 实例。然后,它将实例的现有设置(如 EC2 API 所述)附加到模块的名称 aws_instance.example
。在此示例中,模块路径意味着使用了根模块。最后,映射将保存在 OpenTofu 状态中。
还可以将资源导入到子模块中,使用它们的路径,并使用 count
或 for_each
设置将资源导入到单个实例中。有关如何指定目标资源的更多详细信息,请参阅 资源寻址。
给定 ID 的语法取决于要导入的资源类型。例如,AWS 实例使用由 EC2 API 发行的不透明 ID,但 AWS Route53 区域使用域名本身。有关需要哪种形式的 ID 的详细信息,请查阅每个可导入资源的文档。
作为上述命令的结果,资源将记录在状态文件中。你现在可以运行 tofu plan
来查看配置与导入的资源之间的比较,并对配置进行任何调整以与导入对象的当前(或期望)状态保持一致。
复杂导入
上述导入被认为是“简单导入”:一个资源被导入到状态文件中。导入也可能导致“复杂导入”,其中导入多个资源。例如,AWS 网络 ACL 导入一个 aws_network_acl
,但也为每个规则导入一个 aws_network_acl_rule
。
在这种情况下,辅助资源将不存在于配置中,因此有必要查阅导入输出并在配置中为每个辅助资源创建一个 resource
块。如果没有这样做,OpenTofu 将在下次运行时计划销毁导入的对象。
如果你想重命名或移动导入的资源,可以使用 状态管理命令。