2016-07-20 2 views
25

Я немного озадачен вопросом о том, следует ли передавать .tfstate файлам Git или нет. В документе Terraform documentation указано:Должен ли я передавать файлы .tfstate в Git?

Terraform также поместил некоторое состояние в файл terraform.tfstate по умолчанию. Этот файл состояния чрезвычайно важен; он сопоставляет различные метаданные ресурсов с фактическими идентификаторами ресурсов, чтобы Terraform знал, что он управляет. Этот файл должен быть сохранен и распространен среди всех, кто может использовать Terraform. Мы рекомендуем просто вставить его в контроль версий, поскольку он обычно не слишком велик.

Теперь, с другой стороны, принятый и upvoted ответ на Best practices when using Terraform состояниях:

Terraform конфигурации может использоваться для предоставления многих ящиков на разных инфраструктуры, каждый из которых может иметь другое состояние. Так как он также может управляться несколькими людьми, это состояние должно находиться в централизованном месте (например, S3), но не git.

(Выделено первоначальным автором, не мной)

Кто прав, и если да, то почему?

ответ

12

Ответ Евгения хороший. Вопрос несколько менее спорным сейчас, как Terraform обновили свои документы в состоянии:

Terraform также помещает некоторое состояние в файл terraform.tfstate по умолчанию. Этот файл состояния чрезвычайно важен; он сопоставляет различные метаданные ресурса с фактическими идентификаторами ресурсов, так что Terraform знает, что такое управление . Этот файл должен быть сохранен и распространен любому, у кого может запустить Terraform. Обычно рекомендуется настраивать дистанционное состояние при работе с Terraform. Это будет означать, что любые потенциальные секреты хранятся в файле состояние, не будут проверяться в системе управления версиями

Так что больше нет разногласий между установленной передовой практикой и официальными рекомендациями.

5

Возможно, это будет связано с предпочтением, но я бы сказал, что git (или любой другой элемент управления источником) не является особенно хорошим вариантом для хранения файлов состояний, поскольку они являются результатом кода, который вы пишете, скомпилированный двоичный или даже минимизированный JS или LESS, скомпилированный в CSS.

Кроме того, в файлах состояний вещи могут довольно быстро изменяться в качестве результата для выполняемых вещей, а не на самом деле в коде, что делает все это довольно неудобным.

Однако вам необходимо каким-то образом распространять эти файлы состояний с любыми удаленными членами команды или даже с другими устройствами, если вы работаете на разных ноутбуках/машинах. Вы также захотите каким-то образом сохранить и поддержать их, потому что у вас будет настоящая боль, если вы потеряете файл состояния, так как Terraform использует файлы состояний для определения того, что он управляет, чтобы не ступить на носки другой инструмент.

Я бы сказал, что S3 - это, вероятно, лучшее место, где вы можете их разместить прямо сейчас. Это почти бесплатно, долговечность отличная, как и доступность, есть очень хорошая нативная поддержка для этого в Terraform, используя ресурс remote state. И, вероятно, самое главное, вам нужно создать ведро S3 для начала работы. Необходимо сначала создать кластер Consul или без Terraform (в противном случае у вас есть проблема с курицей и яйцом, где вы храните состояние для их создания?) - это немного боль, даже если вы намереваетесь использовать любой из этих продуктов.

Очевидно, что если вы используете OpenStack, то Swift должен сделать хорошую альтернативу (хотя я ее не использовал). Я также не использовал Hashicorp's Atlas, но если вы счастливы заплатить за эту услугу, это может быть также полезно.

28

Есть несколько причин, чтобы не хранить ваши .tfstate файлов в Git:

  1. Вы, вероятно, забыли совершить и нажать изменения после запуска terraform apply, так что ваши товарищи по команде будут иметь устарелый .tfstate файлы.Кроме того, без блокировки этих файлов состояний, если два члена группы одновременно запускают Terraform в тех же файлах .tfstate, вы можете перезаписать изменения друг друга. Вы можете решить обе проблемы: a) хранение файлов .tfstate в ведре S3 с использованием Terraform remote state, который автоматически будет автоматически нажимать/вытаскивать файлы .tfstate каждый раз при запуске terraform apply и b) используя инструмент, например terragrunt, чтобы обеспечить блокировку для ваших .tfstate файлов.
  2. Файлы .tfstate могут содержать секреты. Например, если вы используете ресурс aws_db_instance, вы должны указать пароль базы данных, и Terraform будет хранить это в открытом виде в файле .tfstate. Это плохая практика от имени Terraform для начала и хранения незашифрованных секретов в управлении версиями, только ухудшает ее. По крайней мере, если вы храните файлы .tfstate на S3, вы можете включить шифрование в покое (SSL обеспечивает шифрование во время движения) и настроить политики IAM, чтобы ограничить доступ пользователей. Это очень далека от идеала, и нам нужно будет увидеть, что о нем когда-либо фиксируется.

Для получения дополнительной информации, ознакомьтесь с How to manage Terraform state и Terraform: Up & Running.

+2

Вот еще одна причина/способ взглянуть на это: рассмотрите TF + Git как разработку программного обеспечения, используя управление версиями. В этом случае вы не будете хранить артефакты сборки (например, файлы состояния) в своем репозитории VC, а вместо этого в центральном хранилище артефактов (например, ведро S3). – KJH

+0

Вам больше не нужен Terragrunt, чтобы обеспечить блокировку.Теперь он встроен в Terraform: https://www.terraform.io/docs/state/locking.html –

Смежные вопросы