Введение
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.



