Spec-Zone.ru › OpenTofu 1.11

Импорт

Экспериментальная функция

Хотя мы не ожидаем внесения обратно несовместимых изменений в синтаксис, флаг -generate-config-out, а также обработка OpenTofu операций импорта на этапе планирования и генерация конфигурации могут измениться в будущих выпусках.

Используйте блок import, чтобы импортировать существующие ресурсы инфраструктуры в OpenTofu и передать их под управление OpenTofu. В отличие от команды tofu import, импорт на основе конфигурации с помощью блоков import предсказуем, работает с конвейерами CICD и позволяет предварительно просмотреть операцию импорта до изменения состояния.

После импорта 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, необходимо:

  1. Определить блок import для ресурса или ресурсов.
  2. Добавить соответствующий блок resource в конфигурацию или сгенерировать конфигурацию для этого ресурса.
  3. Выполнить tofu plan, чтобы проверить, как OpenTofu импортирует ресурс или ресурсы.
  4. Применить конфигурацию, чтобы импортировать ресурсы и обновить состояние OpenTofu.

Блок import является идемпотентным: применение действия импорта и последующий запуск нового плана не приведут к созданию ещё одного действия импорта, пока этот ресурс остаётся в состоянии.

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

Конфигурация ресурса​

Перед импортом необходимо добавить конфигурацию для каждого ресурса, который вы хотите импортировать. В противном случае 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.11/language/import/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API