Я пытаюсь создать сценарий terraform, который будет создавать vpc и другие ресурсы. Я передаю параметры для скриптов из файла .tfvars. Я успешно создал виртуальный компьютер и ресурсы, выполнив сценарий. Теперь я хочу создать еще один vpc с тем же набором ресурсов, но с другим набором значений параметров. Я создал новый файл .tfvars с новыми значениями и попытался выполнить его со старым файлом main.tf. Когда я выполняю команду «план терраформ», это показывает, что он удалит vpc, а ресурсы, созданные во время моего первого запуска, создадут новый vpc с новыми значениями. Есть ли способ создать ресурсы с использованием того же файла terraform main.tf и путем изменения файла .tfvars.
Для этого нужно создать модуль. Вы должны иметь возможность вырезать / вставить свой текущий код в свой модуль. Вам может потребоваться только удалить определение поставщика из вашего модуля. Затем в вашем новом основном коде (корневом модуле) укажите модуль для каждого набора ресурсов, который вы хотите создать.
Причина, по которой TF пытается удалить ресурсы, которые вы уже создали, заключается в том, что они были захвачены в своем состоянии.
Когда вы создаете модуль, добавьте ресурсы, которые вы уже создали, обратно. TF всегда будет пытаться настроить в соответствии с кодом, если ресурсы удалены, он попытается уничтожить их.
Вы столкнулись с проблемой, связанной с состоянием. Когда вы определяете ресурс, вы даете ему имя. Эти имена используются в файле состояний, и именно это заставляет Terraform думать, что вы пытаетесь изменить существующий ресурс. У вас есть несколько способов решить эту проблему, и это зависит от того, что вы на самом деле делаете.
Рабочие области Terraform
Вы можете использовать рабочие области в терраформе для каждого создаваемого VPC, это позволит сохранить состояние разделенным, однако рабочие области действительно предназначены для разделения сред, а не нескольких ресурсов в одной среде. Вы можете прочитать больше здесь.
Модули Terraform
Мне кажется, что вы действительно хотите создать модуль terraform для своей конфигурации VPC. Затем создайте каждый VPC, используя свой модуль в том же файле main.tf. Таким образом, у вас будут ресурсы с уникальными именами, которые не будут сбивать с толку управление состоянием. Вы можете узнать больше о модулях здесь. Хороший ресурс для получения информации об этом можно найти в этом сообщении блог.
Это потому, что вы работаете с одним и тем же файлом tfstate.
После этого вы могли сделать: 1. Если вы работаете с локальным состоянием: скопируйте весь код в другой каталог и с новым файлом tfvars и работайте там. Это запустит новое чистое tfstate
Если вы работаете с удаленным состоянием:
a.
Настройте другое удаленное состояние, а затем используйте новый файл tfvars, или
b.
Создайте другой каталог, создайте символическую ссылку на ваш код в этом каталоге и замените старую конфигурацию серверной части и файл tfvars на новые.
У меня есть пример кода для работы с multi-env https://github.com/pradeepbhadani/tf-course/tree/master/Lesson5
Создайте модуль Terraform вашего кода VPC, а затем вызовите его из отдельного каталога.
Я уже использую модули для создания ресурсов aws, я решил проблему с помощью рабочей области, как вы упомянули. Я создал отдельное рабочее пространство для каждого виртуального компьютера и связанных с ним ресурсов. Теперь я могу выполнить свой сценарий terraform без каких-либо конфликтов между файлами tfstate.