Импорт
Хотя мы не ожидаем внесения обратно несовместимых изменений в синтаксис, флаг -generate-config-out, а также способ обработки OpenTofu операций импорта на этапе планирования и генерации конфигурации могут измениться в будущих выпусках.
Используйте блок import, чтобы импортировать существующие ресурсы инфраструктуры в OpenTofu и передать их под управление OpenTofu. В отличие от команды tofu import, импорт на основе конфигурации с помощью блоков import предсказуем, работает с конвейерами CI/CD и позволяет предварительно просмотреть операцию импорта перед изменением состояния.
После импорта OpenTofu отслеживает ресурс в файле состояния. Затем вы можете управлять импортированным ресурсом так же, как любым другим, изменяя его атрибуты и удаляя его в рамках стандартного жизненного цикла ресурса.
Блок import указывает, что OpenTofu импортировал ресурс, а не создал его. После импорта вы можете удалить блоки импорта из конфигурации или оставить их в качестве записи о происхождении ресурса.
Синтаксис
Вы можете добавить блок import в любой файл конфигурации OpenTofu. Распространенный подход — создать файл imports.tf или разместить каждый блок import рядом с блоком resource, в который он выполняет импорт.
import {
to = aws_instance.example
id = "i-abcd1234"
}
resource "aws_instance" "example" {
name = "hashi"
# (other resource arguments...)
}Приведенный выше блок import определяет импорт экземпляра AWS с идентификатором "i-abcd1234" в ресурс aws_instance.example корневого модуля.
Блок import содержит следующие аргументы:
-
to— адрес экземпляра, по которому этот ресурс будет находиться в файле состояния. -
id— строка с идентификатором импорта ресурса. -
provider(необязательно) — пользовательский провайдер ресурса; подробности см. в разделе метааргумент «Провайдер ресурса». -
for_each(необязательно) — импорт нескольких ресурсов с помощью итерации по карте или набору. См. раздел Импорт нескольких ресурсов ниже.
Если аргумент provider не задан, OpenTofu пытается выполнить импорт с помощью провайдера по умолчанию.
Идентификатор импорта
В блоке импорта необходимо указать аргумент id в виде строкового литерала с идентификатором импорта ресурса. Этот идентификатор нужен OpenTofu, чтобы найти ресурс, который вы хотите импортировать.
Идентификатор импорта ресурса зависит от конкретного ресурса. Необходимый идентификатор можно найти в документации провайдера для ресурса, который вы хотите импортировать.
Планирование и применение импорта
OpenTofu обрабатывает блок import на этапе планирования. После утверждения плана OpenTofu импортирует ресурс в свое состояние на последующем этапе применения.
Чтобы импортировать ресурс с помощью блоков import, необходимо:
- Определить блок
importдля ресурса или ресурсов. - Добавить в конфигурацию соответствующий блок
resourceили сгенерировать конфигурацию для этого ресурса. - Выполнить
tofu plan, чтобы проверить, как OpenTofu импортирует ресурс или ресурсы. - Применить конфигурацию, чтобы импортировать ресурсы и обновить состояние OpenTofu.
Блок import является идемпотентным: применение действия импорта и запуск следующего плана не приведут к созданию нового действия импорта, пока ресурс остается в состоянии.
OpenTofu достаточно импортировать каждый ресурс только один раз. Повторная попытка импортировать ресурс по тому же адресу — безопасная операция, не имеющая последствий. После завершения импорта можно удалить блоки import или оставить их в конфигурации как запись о происхождении ресурса для будущих сопровождающих модуля. Дополнительную информацию о поддержке конфигураций с течением времени см. в разделе Рефакторинг.
Конфигурация ресурса
Перед импортом необходимо добавить конфигурацию для каждого ресурса, который OpenTofu должен импортировать. В противном случае OpenTofu выдаст ошибку при планировании и потребует добавить конфигурацию ресурса, прежде чем сможет выполнить импорт. Конфигурацию ресурса можно создать вручную или сгенерировать с помощью OpenTofu.
Если вы знаете большинство аргументов ресурса, мы рекомендуем написать блок resource. Например, в конфигурации уже может быть похожий ресурс, настройки которого можно скопировать и изменить.
Если вы импортируете несколько ресурсов или один сложный ресурс, для которого у вас еще нет конфигурации, рекомендуем сгенерировать конфигурацию.
Добавление блока resource
Добавьте блок resource для импортируемого ресурса. Адрес ресурса должен совпадать с аргументом to блока импорта.
import {
to = aws_instance.example
id = "i-abcd1234"
}
resource "aws_instance" "example" {
name = "renderer"
}Генерация конфигурации
OpenTofu может генерировать HCL для ресурсов, которых еще нет в конфигурации. Подробности см. в разделе Генерация конфигурации.
Примеры
В следующем примере показано, как выполнить импорт в модуль.
import {
to = module.instances.aws_instance.example
id = "i-abcd1234"
}В приведенном ниже примере показано, как импортировать ресурс, содержащий count.
import {
to = aws_instance.example[0]
id = "i-abcd1234"
}В приведенном ниже примере показано, как импортировать ресурс, содержащий for_each.
import {
to = aws_instance.example["foo"]
id = "i-abcd1234"
}В последнем примере показано, как импортировать ресурс с помощью пользовательского провайдера ресурсов.
provider "aws" {
alias = "europe"
region = "eu-west-1"
}
import {
provider = aws.europe
to = aws_instance.example["foo"]
id = "i-abcd1234"
}Импорт нескольких ресурсов
Вы можете импортировать несколько ресурсов с помощью одного блока импорта, используя выражение for_each. Это выражение принимает набор, кортеж или карту и предоставляет переменные each.key и each.value для доступа к отдельным элементам.
В примере ниже можно указать список идентификаторов серверов для импорта. Если указать пустой список, ресурс random_id сгенерирует все идентификаторы случайным образом. Если указать несколько идентификаторов, блок импорта импортирует их, а ресурс случайным образом сгенерирует остальные. Обратите внимание: ресурс random_id требует, чтобы идентификаторы были в формате base64.
variable "server_ids" {
type = list(string)
}
resource "random_id" "test_id" {
byte_length = 8
count = 2
}
import {
to = random_id.test_id[tonumber(each.key)]
id = each.value
for_each = {
for idx, item in var.server_ids: idx => item
}
}
output "id" {
value = random_id.test_id.*.b64_url
}В настоящее время генерация конфигурации невозможна при использовании for_each в блоках import.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/import/