2017-12-03 186 views
0

假设我已经使用terraform来构建我的基础架构,并且出于某种原因删除了我的tfstate。这意味着我已经在tf文件中定义了我的资源,我只需要重新导入所有内容。导入tf文件中定义的所有资源

这是否必须是手动过程?

比如我这是怎么导入EC2实例:

terraform import aws_instance.web i-123456 

如果我必须做的,对于每一个资源,多数民众赞成相当痛苦的(还不如删除一切,重新开始)。

如果我已经有我的tf文件有一种方法可以导入所有已定义的资源?例如,我需要实例ID才能导入该实例。 terraform import命令是否可以读取我的tf文件并查找映射到“aws_instance.web”的资源?

为了做到这一点,terraform需要将aws实例映射到tf文件中的资源 - 这当然是tfstate的目的。但terraform是否也有一种方法来标记资源与他们的资源映射?所以我可以对tf文件进行导入,terraform只是动态读取tf文件,并通过唯一标签查找与tf资源相对应的物理资源?

+0

如果您定义了两个完全相同的资源,那将如何工作? –

+0

你是什么意思?就像我有两个不同的tf文件定义了一个同名的资源一样?对不起仍然把我的头包裹在terraform中,也许我在这里错过了一些东西? – red888

+0

是的,有点。如果您使用完全相同的参数定义了两个EC2实例(例如),Terraform如何知道哪个实例不存储映射到实例ID? –

回答

2

不,没有办法在Terraform中原生执行此操作;即使你一起编写了脚本 - 我认为它不会很可靠,并且你不能相信它选择了正确的资源(至少不容易)。

Terraform在文档中多次说明您需要保护您的状态文件;这就是为什么像S3这样的远程商店被鼓励用于你关心的任何事情的原因;也是为什么这是Terraform Enterprise的卖点。

+0

所以听起来好像如果你使用terraform你的基础结构更好地动态化,所以你可以构建一个完全新的版本并迁移到如果你的状态不好,你的状态就会被破坏 – red888

+1

@ red888我的意思是说,对于你所使用的任何东西来说都是真的,Terraform建议使用S3作为数据存储并确保启用版本控制。 –

相关问题