2016-07-20 119 views
25

對於是否將.tfstate文件提交給Git的問題,我有點困惑。 Terraform documentation陳述如下:我應該將.tfstate文件提交給Git嗎?

Terraform默認也會將一些狀態置入terraform.tfstate文件。這個狀態文件非常重要。它將各種資源元數據映射到實際資源ID,以便Terraform知道它正在管理什麼。該文件必須保存並分發給任何可能運行Terraform的人。我們建議將它放入版本控制中,因爲它通常不會太大。

現在,在另一方面,在Best practices when using Terraform國家接受和upvoted答案:

Terraform配置可以用來在不同的基礎設施提供多少盒,每個可以有不同的狀態。由於它也可以由多人運行,所以此狀態應該位於中央位置(如S3),但而不是 git。

(重點原作者,不是我)

誰是對的,如果是這樣,爲什麼呢?

回答

12

Yevgeniy的回答是一個很好的答案。現在的問題是有些爭議較少的Terraform有自己的文檔更新狀態:

Terraform也 默認情況下把一些狀態到terraform.tfstate文件。這個狀態文件非常重要。它將各種 資源元數據映射到實際資源ID,以便Terraform知道它正在管理什麼 。該文件必須保存並分發給任何可能運行Terraform的人。通常建議在使用Terraform時設置遠程狀態 。這將意味着存儲在狀態文件中的任何潛在的祕密 ,不會簽入到版本控制

所以不再有既定的最佳實踐和官方建議存在分歧。

5

這可能會歸結爲偏好,但我會說git(或任何其他源代碼管理)不是一個特別好的選擇來存儲狀態文件,因爲它們是您寫的代碼的輸出很像一個編譯二進制或甚至最小化JS或LESS編譯爲CSS。

更重要的是事情可能會在狀態文件相當迅速改變,因爲輸出到事物的頂部正在運行,而不是事情正在使整個事情比較尷尬的代碼實際上改變。

但是,如果您正在開發不同的筆記本電腦/機器,您需要某種方式與任何遠程團隊成員或甚至其他設備共享這些狀態文件。您還需要一些方法來存儲和備份這些文件,因爲如果您丟失了一個狀態文件,您將會遇到一些真正的痛苦,因爲Terraform使用狀態文件來確定它正在管理的事情,以免踩到腳趾其他工具。

我想說S3可能是你現在可以放置它們的最好的地方。它非常免費,耐用性和可用性一樣出色,在Terraform中使用remote state資源提供了非常好的本地支持。可能最重要的是,您只需創建一個S3存儲桶即可開始使用。必須首先建立一個沒有Terraform的Consuletcd集羣(否則,如果您打算使用這兩種產品中的任何一種產品,那麼您在哪裏存儲用於創建這些狀態的雞蛋和雞蛋問題?)有點痛苦。

顯然,如果你正在使用的OpenStack然後Swift應該做一個很好的選擇(雖然我沒有使用它)。我也沒有使用Hashicorp的Atlas,但如果你很樂意爲該服務付費,它可能同樣有用。

28

有幾個原因不是你.tfstate文件存儲在Git中:

  1. 你可能會忘記提交和運行terraform apply後,把你的變化,讓你的隊友會外的日期.tfstate文件。另外,如果兩個團隊成員在同一個.tfstate文件中同時運行Terraform,則不會對這些狀態文件進行任何鎖定,您可能會覆蓋彼此的更改。您可以通過以下兩種方式解決這兩個問題:a)使用Terraform remote state.tfstate文件存儲在S3存儲桶中,每次運行terraform apply時會自動推/拉.tfstate文件; b)使用terragrunt之類的工具爲您的.tfstate文件提供鎖定。
  2. .tfstate文件可能包含祕密。例如,如果使用aws_db_instance資源,則必須指定數據庫密碼,Terraform將以明文形式將其存儲在.tfstate文件中。在Terraform的開始階段,這是一個不好的做法,在版本控制中存儲未加密的祕密只會使情況變得更糟。至少如果您在S3中存儲.tfstate文件,則可以啓用靜態加密(SSL在移動時提供加密)並配置IAM策略以限制訪問權限。這非常不理想,我們不得不看看open issue discussing this problem有沒有被修復。

欲瞭解更多信息,請How to manage Terraform stateTerraform: Up & Running

+2

下面是看看這個的另一個原因/方法:將TF + Git看作使用版本控制的軟件開發。 在這種情況下,您不會將構建工件(即狀態文件)存儲在VC回購庫中,而是存儲在中央工件存儲庫(例如S3存儲桶)中。 – KJH

+0

你不需要Terragrunt來提供鎖定了。它現在內置到Terraform中:https://www.terraform.io/docs/state/locking.html –

相關問題