2017-12-03 125 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作爲數據存儲並確保啓用版本控制。 –

相關問題