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