Генерация конфигурации
Генерация конфигурации доступна в OpenTofu v1.6 в качестве экспериментальной функции. В последующих минорных версиях могут измениться форматирование сгенерированной конфигурации и поведение команды tofu plan при использовании флага -generate-config-out.
OpenTofu может генерировать код для ресурсов, определенных в блоках import, которых еще нет в вашей конфигурации. OpenTofu создает HCL-код в качестве шаблона, содержащего наиболее вероятные, по оценке OpenTofu, значения для каждого аргумента ресурса.
Взяв за основу сгенерированный OpenTofu HCL-код, рекомендуется итеративно довести конфигурацию до идеального вида: удалить ненужные атрибуты, скорректировать значения других и при необходимости распределить блоки resource по файлам и модулям.
Чтобы сгенерировать конфигурацию, выполните команду tofu plan с флагом -generate-config-out и укажите путь к новому файлу. Не указывайте путь к уже существующему файлу, иначе OpenTofu вернет ошибку.
$ tofu plan -generate-config-out=generated_resources.tf
Если какие-либо ресурсы, указанные в блоке import, отсутствуют в вашей конфигурации, OpenTofu сгенерирует и запишет конфигурацию для этих ресурсов в generated_resources.tf.
Рабочий процесс
Рабочий процесс генерации конфигурации аналогичен процессу работы с блоком import с добавлением этапа генерации конфигурации на шаге планирования. Затем вы можете просмотреть и изменить сгенерированную конфигурацию перед ее применением.
1. Добавьте блок import
Добавьте блок import в вашу конфигурацию. Этот блок import может находиться в отдельном файле (например, import.tf) или в существующем конфигурационном файле.
import {
to = aws_iot_thing.bar
id = "foo"
}Аргумент to блока импорта указывает на адрес, который resource будет иметь в вашем файле состояния. Если адрес ресурса в состоянии совпадает с аргументом to блока import, OpenTofu попытается импортировать в этот ресурс. При последующем планировании OpenTofu будет знать, что для ресурсов, уже присутствующих в вашем состоянии, генерировать конфигурацию не требуется.
В качестве аргумента id блока импорта используется идентификатор импорта (import ID) этого ресурса.
Если в вашей конфигурации нет других ресурсов для выбранного провайдера, необходимо добавить блок provider, чтобы указать OpenTofu, какой провайдер следует использовать для генерации конфигурации. В противном случае OpenTofu выдаст ошибку, если не сможет определить нужный провайдер. Если вы добавите новый блок provider в конфигурацию, вам потребуется снова выполнить tofu init.
2. Создание плана и генерация конфигурации
Чтобы OpenTofu сгенерировал конфигурацию для определенных вами блоков import, выполните команду tofu plan с флагом -generate-config-out= и указанием пути к новому файлу. OpenTofu отобразит план импорта вашего ресурса и имя файла, в котором была создана конфигурация на основе этого плана.
$ tofu plan -generate-config-out=generated.tf
aws_iot_thing.bar: Preparing import... [id=foo]
aws_iot_thing.bar: Refreshing state... [id=foo]
OpenTofu will perform the following actions:
# aws_iot_thing.bar will be imported
# (config will be generated)
resource "aws_iot_thing" "bar" {
arn = "arn:aws:iot:eu-west-1:1234567890:thing/foo"
attributes = {}
default_client_id = "foo"
id = "foo"
name = "foo"
version = 1
}
Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.
╷
│ Warning: Config generation is experimental
│
│ Generating configuration during import is currently experimental, and the generated configuration format may change in future versions.
╵
───────────────────────────────────────────────────────────────────────────────────────────────── ─────────────────────────────────────────────────
OpenTofu has generated configuration and written it to generated.tf. Please review the configuration and edit it as necessary before adding it to version control.3. Проверка сгенерированной конфигурации
В приведенном выше примере OpenTofu создает конфигурацию в файле с именем generated.tf. Ниже приведен пример файла generated.tf.
resource aws_iot_thing "bar" {
name = "foo"
}Проверьте сгенерированную конфигурацию и при необходимости внесите изменения. Вы можете переместить ее в другой файл, добавить или удалить аргументы ресурса, либо обновить ее для ссылки на входные переменные или другие ресурсы в вашей конфигурации.
Подсказки в сгенерированном коде
В некоторых случаях к атрибутам сгенерированных блоков могут добавляться комментарии. В таком комментарии может быть указана причина, по которой значение было пропущено. Например, следующее будет сгенерировано, если созданный блок resource содержит конфиденциальные атрибуты или атрибуты, доступные только для записи:
resource "test_resource" "test" {
attr1 = null # sensitive
attr2 = null # write-only
attr3 = null # sensitive write-only
}4. Применение изменений
Выполните команду tofu apply для импорта вашей инфраструктуры.
$ tofu apply
aws_iot_thing.bar: Preparing import... [id=foo]
aws_iot_thing.bar: Refreshing state... [id=foo]
OpenTofu will perform the following actions:
# aws_iot_thing.bar will be imported
resource "aws_iot_thing" "bar" {
arn = "arn:aws:iot:eu-west-1:1234567890:thing/foo"
attributes = {}
default_client_id = "foo"
id = "foo"
name = "foo"
version = 1
}
Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.
aws_iot_thing.bar: Importing... [id=foo]
aws_iot_thing.bar: Import complete [id=foo]
Apply complete! Resources: 1 imported, 0 added, 0 changed, 0 destroyed.
Зафиксируйте новую конфигурацию ресурсов в вашей системе контроля версий.
Ограничения
Конфликтующие аргументы ресурсов
При формировании плана OpenTofu генерирует конфигурацию для импортируемых ресурсов, запрашивая значения атрибутов ресурсов у провайдера. Для некоторых ресурсов со сложной схемой OpenTofu может оказаться не в состоянии составить корректную конфигурацию на основе этих значений.
OpenTofu выведет ошибку, подобную приведенной ниже, если он не получит значения атрибутов ресурсов во время генерации конфигурации.
$ tofu plan -generate-config-out=generated.tf ╷ │ Error: Conflicting configuration arguments │ │ with aws_instance.ubuntu, │ on g.tf line 20, in resource "aws_instance" "ubuntu": │ 20: ipv6_address_count = 0 │ │ "ipv6_address_count": conflicts with ipv6_addresses ╵
В приведенном выше примере OpenTofu все равно сгенерирует конфигурацию и запишет ее в generated.tf. Эта ошибка вызвана конфликтом между аргументами ipv6_address_count и ipv6_addresses. Ресурс поддерживает оба этих аргумента, но при его настройке необходимо выбрать только один из них. Вы можете устранить ошибку, удалив один из двух аргументов, а затем снова запустив tofu plan, чтобы убедиться в отсутствии других проблем.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.12/language/import/generating-configuration/