2016-07-20 15 views
25

Ich bin ein wenig verwirrt über die Frage, ob .tfstate Dateien an Git zu begehen oder nicht. Die Terraform documentation Staaten:Sollte ich .tfstate Dateien an Git übergeben?

Terraforming setzen auch einige Zustand in die terraform.tfstate Datei standardmäßig. Diese Statusdatei ist extrem wichtig. Es ordnet verschiedene Ressourcenmetadaten den tatsächlichen Ressourcen-IDs zu, so dass Terraform weiß, was es verwaltet. Diese Datei muss gespeichert und an alle Benutzer von Terraform verteilt werden. Wir empfehlen, es einfach in die Versionskontrolle zu stellen, da es im Allgemeinen nicht zu groß ist. Jetzt

, auf der anderen Seite, die akzeptiert und upvoted Antwort auf Best practices when using Terraform heißt es:

Terraforming Config kann die Bereitstellung viele Boxen auf unterschiedliche Infrastruktur verwendet werden, von denen jede einen anderen Staat haben könnte. Da es auch von mehreren Personen betrieben werden kann, sollte dieser Zustand an einem zentralen Ort sein (wie S3), aber nicht git.

(Hervorhebung durch den ursprünglichen Autor, nicht von mir)

Wer richtig ist, und wenn ja, warum?

Antwort

12

Yevgeniys Antwort ist eine gute. Das Problem ist, etwas weniger umstritten jetzt als Terraforming ihre docs Zustand aktualisiert:

Terraforming bringt auch einige Zustand in die terraform.tfstate Datei von Standard. Diese Statusdatei ist extrem wichtig. Sie ordnet verschiedene Ressourcen-Metadaten den tatsächlichen Ressourcen-IDs zu, so dass Terraform weiß, was verwaltet. Diese Datei muss gespeichert und an alle Personen verteilt werden, die Terraform unter der Nummer ausführen. Es wird generell empfohlen, bei der Arbeit mit Terraform den Fernstatus einzurichten. Dies bedeutet, dass mögliche Geheimnisse in der Statusdatei gespeichert ist, werden nicht in der Versionskontrolle

gibt es nicht mehr eine Meinungsverschiedenheit zwischen bewährten Praktiken und offiziellen Empfehlungen So überprüft werden.

5

Dies wird wahrscheinlich auf Präferenz kommen, aber ich würde sagen, git (oder eine andere Quellcodeverwaltung) ist keine besonders gute Option zum Speichern von Statusdateien, da sie eine Ausgabe des Codes sind, den Sie ähnlich wie schreiben kompilierte binäre oder sogar minimierte JS oder LESS kompiliert nach CSS.

Hinzu kommt, dass sich die Dinge in den Statusdateien ziemlich schnell ändern können, da die Ausgabe an Dinge, die ausgeführt werden, geändert wird, anstatt Dinge tatsächlich im Code zu ändern.

Sie benötigen jedoch eine Möglichkeit, diese Statusdateien mit beliebigen Remote-Teammitgliedern oder anderen Geräten zu teilen, wenn Sie auf verschiedenen Laptops/Computern arbeiten. Sie werden auch eine Möglichkeit haben, diese zu speichern und zu sichern, weil Sie echte Probleme haben werden, wenn Sie eine Statusdatei verlieren, da Terraform die Zustandsdateien verwendet, um herauszufinden, welche Dinge es verwaltet, um nicht auf die Zehenspitzen zu treten andere Werkzeuge.

Ich würde sagen, dass S3 ist wahrscheinlich der beste Ort, den Sie ihnen jetzt setzen können. Es ist ziemlich kostenlos, die Haltbarkeit ist exzellent, ebenso wie die Verfügbarkeit, es gibt eine sehr gute native Unterstützung in Terraform mit der Ressource remote state. Und am wichtigsten ist, dass Sie nur einen S3-Bucket erstellen müssen, um loszulegen. Ein Consul oder etcd Cluster zuerst ohne Terraform zu bauen (sonst haben Sie ein Huhn und Ei Problem, wo speichern Sie den Staat für die Erstellung dieser?) Ist ein bisschen Schmerz, auch wenn Sie beabsichtigen, eines dieser Produkte zu verwenden.

Offensichtlich, wenn Sie OpenStack verwenden, dann sollte Swift eine gute Alternative machen (obwohl ich es nicht benutzt habe). Ich habe auch nicht Hashicorp Atlas verwendet, aber wenn Sie gerne für diesen Service bezahlen, könnte es ebenso nützlich sein.

28

Es gibt ein paar Gründe, nicht Ihre .tfstate Dateien in Git zu speichern:

  1. Sie sind wahrscheinlich nach dem Ausführen terraform apply, so dass Ihre Mitspieler werden zu begehen, und drücken Sie die Änderungen vergessen haben out-of-date .tfstate Dateien.Wenn zwei Teammitglieder Terraform zur gleichen Zeit auf denselben .tfstate Dateien ausführen, können Sie auch ohne die Sperrung dieser Statusdateien die gegenseitigen Änderungen überschreiben. Sie können beide Probleme lösen, indem Sie a) .tfstate Dateien in einem S3 Bucket mit speichern, die die .tfstate Dateien automatisch jedes Mal drücken/ziehen, wenn Sie terraform apply ausführen und b) ein Werkzeug wie terragrunt verwenden, um Ihre .tfstate Dateien zu sperren.
  2. Die .tfstate Dateien können Geheimnisse enthalten. Wenn Sie beispielsweise die Ressource aws_db_instance verwenden, müssen Sie ein Datenbankkennwort angeben, und Terraform speichert dies im Klartext in der Datei .tfstate. Dies ist eine schlechte Praxis für Terraform, und das Speichern unverschlüsselter Geheimnisse in der Versionskontrolle macht es nur noch schlimmer. Zumindest wenn Sie .tfstate Dateien in S3 speichern, können Sie die Verschlüsselung im Ruhezustand aktivieren (SSL bietet Verschlüsselung während der Übertragung) und IAM-Richtlinien konfigurieren, um einzuschränken, wer Zugriff hat. Es ist sehr weit vom Ideal entfernt und wir werden sehen müssen, ob das open issue discussing this problem darüber jemals behoben wird.

Für mehr Informationen, überprüfen How to manage Terraform state und Terraform: Up & Running aus.

+2

Hier ist ein weiterer Grund, dies zu betrachten: Betrachten Sie TF + Git als Softwareentwicklung mit Versionskontrolle. In diesem Fall würden Sie Ihre Build-Artefakte (d. H. Statusdateien) nicht in Ihrem VC-Repo speichern, sondern stattdessen in einem zentralen Artefakt-Repository (z. B. S3-Bucket). – KJH

+0

Sie brauchen Terragrunt nicht mehr, um das Sperren zu ermöglichen. Es ist jetzt in Terraform integriert: https://www.terraform.io/docs/state/locking.html –