Работа с состоянием

DockerBeginner
Практиковаться сейчас

Введение

В предыдущих лабораторных работах вы играли роль шеф-повара: составляли меню (конфигурации), по которому робот (Terraform) должен был готовить блюда (создавать инфраструктуру). Но как робот запоминает, что уже приготовлено?

Представьте, что у вас есть склад, но вы потеряли опись. Вы не будете знать, что у вас есть, где это находится и не было ли что-нибудь украдено.

В Terraform такая опись называется состоянием. Это память Terraform. В ней записано, какие ресурсы он создал, а объекты конфигурации сопоставлены с объектами реальной инфраструктуры.

Именно состояние делает декларативное управление практически применимым. Без него Terraform мог бы читать ваши файлы, но у него не было бы надёжной информации о том, каким объектам реальной инфраструктуры соответствуют эти объявления.

Состояние — одна из важнейших концепций Terraform. Без него Terraform не знал бы, что уже существует, что изменилось и какие ресурсы нужно обновить или создать заново.

В этой лабораторной работе вы увидите, как Terraform использует состояние, чтобы поддерживать инфраструктуру в рабочем состоянии. Вы будете играть роль «Хаоса»: вручную нарушите работу системы и увидите, как Terraform обнаружит повреждение и автоматически «исцелит» её.

Просмотр состояния

Мы заранее настроили для вас это окружение. В нём уже есть файл main.tf, а команда terraform apply уже была выполнена. Это означает, что инфраструктура (контейнер Docker) уже работает.

Сначала убедитесь, что контейнер запущен:

sudo docker ps

В выводе должен быть контейнер с именем tutorial.

Теперь просмотрите файлы в текущем каталоге. Вы увидите terraform.tfstate.

ls -l

Этот файл — «секретный дневник» Terraform. Здесь Terraform записывает всё, что он делает. Заглянем внутрь.

cat terraform.tfstate

Вывод представлен в формате JSON. Сначала он может показаться сложным, но на самом деле это всего лишь структурированный способ записывать сведения, удобный для компьютеров.

В этом тексте вы найдёте docker_container и идентификатор работающего контейнера. Это подтверждает, что Terraform «знает» об этом конкретном контейнере.

Важное правило: никогда не редактируйте этот файл вручную. Если изменить его, Terraform потеряет сведения о состоянии и может случайно удалить или повредить инфраструктуру. Всегда позволяйте Terraform самостоятельно управлять своим дневником.

Это предупреждение важно, потому что состояние — не просто журнал, а авторитетные метаданные. Если повредить его, Terraform впоследствии может принять опасные или непонятные решения.

Создание расхождения

Terraform рассчитывает быть единственным управляющим для этих ресурсов. Но в реальном мире происходят разные ситуации: например, сервер может выйти из строя, а коллега — случайно удалить что-нибудь вручную.

Такая ситуация называется расхождением. Это означает, что «Реальность» больше не совпадает с «Планом».

Расхождения часто возникают в общих окружениях, потому что люди, скрипты, сбои и внешние системы могут изменять инфраструктуру вне обычного цикла управления Terraform.

Создадим хаос. Мы обойдём Terraform и удалим контейнер напрямую с помощью команд Docker.

sudo docker rm -f tutorial

Убедитесь, что контейнер действительно удалён:

sudo docker ps

Теперь возникла проблема:

  • Реальность: контейнер остановлен и удалён.
  • Файл состояния: Terraform считает, что контейнер всё ещё работает, поскольку никто не сообщил ему об обратном.

Обнаружение расхождения

Теперь проверим, заметит ли Terraform «кражу».

При выполнении terraform plan Terraform сначала обновляет состояние — выполняет операцию Refresh. Он обращается к Docker с вопросом: «Эй, контейнер с идентификатором XYZ всё ещё существует?»

Выполните команду планирования:

terraform plan

Внимательно изучите вывод. В нём должна появиться строка: docker_container.nginx: Refreshing state...

Затем Terraform покажет план с зелёным символом + (создание):

Terraform will perform the following actions:

  ## docker_container.nginx will be created
  + resource "docker_container" "nginx" { ... }

Terraform разобрался в ситуации. Его рассуждение выглядит так: «В моём плане должен быть контейнер. В реальности контейнера нет. Значит, я должен создать новый контейнер, чтобы получить нужное состояние».

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

Восстановление инфраструктуры

Это возможность самовосстановления, которую предоставляет подход Infrastructure as Code. Поскольку наш код определяет Требуемое состояние (работающий контейнер), Terraform может автоматически устранять возникшие расхождения.

Выполните apply, чтобы исправить проблему:

terraform apply

Когда появится запрос, введите yes.

После завершения снова проверьте Docker:

sudo docker ps

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

Итоги

В этой лабораторной работе вы увидели, насколько важно состояние.

Вы узнали:

  • Файл состояния: память Terraform о существующих объектах (terraform.tfstate).
  • Обнаружение расхождений: как Terraform замечает изменения, выполненные без его ведома, например ручное удаление.
  • Самовосстановление: как terraform apply автоматически восстанавливает отсутствующие ресурсы в соответствии с кодом.

Именно благодаря такой надёжности Terraform используют для управления критически важной инфраструктурой. Даже если произойдёт сбой, Terraform поможет быстро вернуть инфраструктуру в заведомо исправное состояние.