Управление состоянием Terraform (Terraform State Management)

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

Введение

Terraform использует файл состояния (state file) для хранения информации об управляемой им инфраструктуре. Этот файл состояния имеет решающее значение, поскольку он сопоставляет ресурсы, определенные в ваших конфигурационных файлах, с реальными ресурсами. Поддерживая это состояние, Terraform может определять, какие ресурсы необходимо создать, обновить или удалить.

В этой лабораторной работе вы получите практический опыт управления состоянием Terraform. Вы узнаете, как использовать различные подкоманды terraform state для проверки текущего состояния, перечисления управляемых ресурсов, переименования ресурса в состоянии и обновления (refresh) состояния для его согласования с фактической инфраструктурой. Это фундаментальные навыки для любого пользователя Terraform.

Просмотр текущего состояния с помощью terraform show

На этом шаге вы узнаете, как просматривать текущее состояние с помощью команды terraform show. Эта команда предоставляет удобочитаемый вывод ресурсов, которыми в данный момент управляет Terraform, как это зафиксировано в файле состояния. Это безопасный способ только для чтения для проверки состояния вашей инфраструктуры.

Скрипт настройки для этой лабораторной работы уже инициализировал Terraform и создал ресурс, сгенерировав файл terraform.tfstate. Давайте его просмотрим.

Выполните следующую команду в вашем терминале:

terraform show

Вы увидите подробный вывод, описывающий ресурс local_file, которым управляет Terraform.

## local_file.example:
resource "local_file" "example" {
    content              = "This is an example file managed by Terraform."
    content_base64sha256 = "F5EYZhFNzSXdE4CUftwQoDVqvdiufZpVyiLMqyZVOcQ="
    content_base64sha512 = "m1hvaxMuc/EhaKintyI54NSTTJ5yXpqHPCBNoHubF0rvF3JAj36lMj20aPcv21+3/OK+SqkiTlnT/LdvLCwqDA=="
    content_md5          = "a43bdd236c2f0f4d87452ba2ef0867e4"
    content_sha1         = "ec3adcab998872def2df6200fb03992ac6f237a4"
    content_sha256       = "17911866114dcd25dd1380947edc10a0356abdd8ae7d9a55ca22ccab265539c4"
    content_sha512       = "9b586f6b132e73f12168a8a7b72239e0d4934c9e725e9a873c204da07b9b174aef1772408f7ea5323db468f72fdb5fb7fce2be4aa9224e59d3fcb76f2c2c2a0c"
    directory_permission = "0777"
    file_permission      = "0777"
    filename             = "./example.txt"
    id                   = "ec3adcab998872def2df6200fb03992ac6f237a4"
}

Этот вывод подтверждает, что Terraform осведомлен об одном ресурсе, local_file.example, и перечисляет все его атрибуты.

Проверка файла состояния terraform.tfstate

На этом шаге вы изучите необработанный файл состояния, terraform.tfstate. В то время как terraform show предоставляет удобное для пользователя представление, просмотр необработанного JSON-файла помогает понять, как Terraform хранит данные.

Внимание: Вам почти никогда не следует редактировать файл terraform.tfstate вручную. Неправильные изменения могут повредить ваше состояние и привести к серьезным проблемам. Мы просматриваем его только в образовательных целях.

Используйте команду cat для отображения содержимого файла состояния:

cat terraform.tfstate

Вывод будет представлять собой JSON-объект. Он содержит метаданные, такие как версия Terraform, и, что наиболее важно, массив resources.

{
  "version": 4,
  "terraform_version": "1.13.3",
  "serial": 1,
  "lineage": "2a568739-a81d-ced7-dee1-7a92a1666022",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "local_file",
      "name": "example",
      "provider": "provider[\"registry.terraform.io/hashicorp/local\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "content": "This is an example file managed by Terraform.",
            "content_base64sha256": "...",
            "content_base64sha512": "...",
            "content_md5": "...",
            "content_sha1": "...",
            "content_sha256": "...",
            "content_sha512": "...",
            "directory_permission": "0777",
            "file_permission": "0777",
            "filename": "./example.txt",
            "id": "ec3adcab998872def2df6200fb03992ac6f237a4",
            "sensitive_content": null,
            "source": null
          },
          "sensitive_attributes": [
            [
              {
                "type": "get_attr",
                "value": "sensitive_content"
              }
            ]
          ],
          "identity_schema_version": 0
        }
      ]
    }
  ],
  "check_results": null
}

Эти необработанные данные — это то, что Terraform использует для создания планов выполнения (execution plans).

Выполнение terraform state list для перечисления ресурсов

На этом шаге вы будете использовать terraform state list, чтобы получить краткий список всех ресурсов в состоянии. Когда ваша инфраструктура растет, и у вас есть десятки или сотни ресурсов, terraform show может быть слишком многословным. Команда state list предоставляет простой список адресов ресурсов, разделенных переводом строки.

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

terraform state list

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

local_file.example

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

Использование terraform state mv для переименования ресурса

На этом шаге вы узнаете, как переименовать ресурс в файле состояния с помощью команды terraform state mv. Это распространенная задача при рефакторинге вашего кода Terraform. Если вы переименуете блок ресурса в файле .tf, Terraform решит, что вы хотите уничтожить старый ресурс и создать новый. Команда state mv позволяет обновить файл состояния в соответствии с изменениями в вашем коде, предотвращая ненужное уничтожение и создание.

Сначала переименуем ресурс в нашем конфигурационном файле. Откройте main.tf с помощью редактора nano:

nano main.tf

Измените имя ресурса с example на example_renamed. Файл должен выглядеть следующим образом:

resource "local_file" "example_renamed" {
  content  = "This is an example file managed by Terraform."
  filename = "${path.module}/example.txt"
}

Нажмите Ctrl+X, затем Y и Enter, чтобы сохранить и выйти.

Теперь выполните terraform plan, чтобы увидеть, что намерен сделать Terraform:

terraform plan

План покажет, что Terraform хочет уничтожить local_file.example и создать local_file.example_renamed, что не является тем, что нам нужно.

local_file.example: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:

  ## local_file.example will be destroyed
  ## (because local_file.example is not in configuration)
  - resource "local_file" "example" {
      - content              = "This is an example file managed by Terraform." -> null
      - content_base64sha256 = "F5EYZhFNzSXdE4CUftwQoDVqvdiufZpVyiLMqyZVOcQ=" -> null
      - content_base64sha512 = "m1hvaxMuc/EhaKintyI54NSTTJ5yXpqHPCBNoHubF0rvF3JAj36lMj20aPcv21+3/OK+SqkiTlnT/LdvLCwqDA==" -> null
      - content_md5          = "a43bdd236c2f0f4d87452ba2ef0867e4" -> null
      - content_sha1         = "ec3adcab998872def2df6200fb03992ac6f237a4" -> null
      - content_sha256       = "17911866114dcd25dd1380947edc10a0356abdd8ae7d9a55ca22ccab265539c4" -> null
      - content_sha512       = "9b586f6b132e73f12168a8a7b72239e0d4934c9e725e9a873c204da07b9b174aef1772408f7ea5323db468f72fdb5fb7fce2be4aa9224e59d3fcb76f2c2c2a0c" -> null
      - directory_permission = "0777" -> null
      - file_permission      = "0777" -> null
      - filename             = "./example.txt" -> null
      - id                   = "ec3adcab998872def2df6200fb03992ac6f237a4" -> null
    }

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Чтобы это исправить, мы сообщим Terraform, что мы просто переместили ресурс. Выполните команду terraform state mv со старым адресом и новым адресом:

terraform state mv local_file.example local_file.example_renamed

Вы увидите подтверждающее сообщение:

Move "local_file.example" to "local_file.example_renamed"
Successfully moved 1 object(s).

Теперь снова выполните terraform plan:

terraform plan

На этот раз Terraform сообщает, что изменения не требуются, поскольку состояние теперь соответствует конфигурации.

local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

Выполнение terraform refresh для обновления состояния

На этом шаге вы будете использовать terraform refresh для синхронизации файла состояния с реальной инфраструктурой. Иногда изменения в вашей инфраструктуре происходят вне контроля Terraform. Это называется "дрейфом" (drift). Команда refresh обновляет файл состояния, чтобы отразить эти изменения.

Давайте смоделируем дрейф, вручную удалив файл, созданный Terraform.

rm example.txt

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

terraform plan
local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

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

terraform refresh
local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Теперь снова выполните terraform plan, чтобы убедиться, что состояние актуально.

terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Вы успешно использовали terraform refresh для устранения дрейфа состояния.

Резюме

Поздравляем с завершением этой лабораторной работы по управлению состоянием Terraform (Terraform State Management)!

В этой лабораторной работе вы получили практический опыт работы с основными подкомандами terraform state. Вы узнали, как:

  • Использовать terraform show для просмотра удобочитаемого представления состояния вашей инфраструктуры.
  • Просматривать необработанный JSON-файл terraform.tfstate для понимания его структуры.
  • Получать чистый список всех управляемых ресурсов с помощью terraform state list.
  • Безопасно переименовывать ресурс в вашей конфигурации и соответствующим образом обновлять состояние с помощью terraform state mv.
  • Синхронизировать ваш файл состояния с реальной инфраструктурой и исправлять дрейф с помощью terraform refresh.

Освоение этих команд является основополагающим для эффективного и уверенного управления вашей инфраструктурой с помощью Terraform.