Генерация конфигурации
Генерация конфигурации доступна в 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 будет иметь в вашем файле состояния (state). Если адрес ресурса в состоянии совпадает с аргументом 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"
}Проверьте сгенерированную конфигурацию и внесите необходимые изменения. Вы можете переместить сгенерированную конфигурацию в другой файл, добавить или удалить аргументы ресурса, либо обновить ее для ссылки на входные переменные или другие ресурсы в вашей конфигурации.
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.10/language/import/generating-configuration/