#kubernetes #terraform
Вопрос:
Я использую версию Terraform 0.12. У меня есть требование пропустить создание ресурса, если ресурс с таким же именем уже существует.
Для этого я сделал следующее :
Прочитайте список пользовательских изображений,
data "ibm_is_images" "custom_images" {
}
Проверьте, существует ли уже изображение,
locals {
custom_vsi_image = contains([for x in data.ibm_is_images.custom_images.images: "true" if x.visibility == "private" amp;amp; x.name == var.vnf_vpc_image_name], "true")
}
output "abc" {
value="${local.custom_vsi_image}"
}
Создавайте только в том случае, если существующее изображение является ложным.
resource "ibm_is_image" "custom_image" {
count = "${local.custom_vsi_image == true ? 0 : 1}"
depends_on = ["data.ibm_is_images.custom_images"]
href = "${local.image_url}"
name = "${var.vnf_vpc_image_name}"
operating_system = "centos-7-amd64"
timeouts {
create = "30m"
delete = "10m"
}
}
Это прекрасно работает в первый раз с «terraform apply». Он обнаруживает, что изображения не существовало, поэтому он создает изображение.
Когда я запускаю «terraform apply» во второй раз. Это удаление ресурса «custom_image», созданного выше. Есть идеи, почему он удаляет ресурс, когда он запускается во 2-й раз ?
Кроме того, как создать ресурс на основе некоторого условия(например, только тогда, когда он не существует) ?
Комментарии:
1. Весь код для проверки существования ресурса и поддержания его идемпотентности не нужен, поскольку функции CRUD поставщика уже предоставляют эту функциональность. Попробуйте удалить весь этот связанный код и сосредоточиться только на фактическом ресурсе. Если он ведет себя неправильно, то отладка должна идти в этом направлении.
2. В этом блоге, itnext.io/… Он объясняет одно и то же поведение: поведение, которое я наблюдал при смешивании обоих стилей, заключалось в том, что если бы автономных ресурсов не существовало, они были бы созданы. Однако после создания, если бы я снова запустил terraform apply, они были бы удалены. Если бы я попробовал еще раз, они были бы созданы и так далее…
3. Это звучит как ошибка или ваше состояние не сохраняется / считывается правильно. Можете ли вы удалить проверку «локальные» и показать нам выходные данные приложения, которое создает, и приложения, которое пытается его удалить?
4. Я открыл ошибку здесь: github.com/hashicorp/terraform/issues/23772
5. Вам просто нужно провести рефакторинг ваших модулей tf, чтобы избежать этой неправильной идеи
Ответ №1:
В Terraform вы должны четко решить, какая система отвечает за управление конкретным объектом, и, наоборот, какие системы просто потребляют существующий объект. Нет никакого способа принять это решение динамически, потому что это сделало бы результат недетерминированным и-для объектов, управляемых Terraform, — сделало бы неясным, какая конфигурация terraform destroy
уничтожит объект.
Действительно, этот недетерминизм является причиной того, что вы видите, как Terraform в вашей ситуации колеблется между попытками создать, а затем удалить ресурс: вы сказали Terraform управлять этим объектом только в том случае, если он еще не существует, и поэтому при первом запуске Terraform после его существования Terraform увидит, что объект больше не управляется, и поэтому он планирует его уничтожить.
Если ваша цель состоит в том, чтобы управлять всем с помощью Terraform, важной задачей проектирования является определение того, как зависимости объектов протекают внутри конфигураций Terraform и между ними. В вашем случае, похоже, существует связь между производителем и потребителем между системой, которая управляет изображениями (которые могут быть или не быть конфигурацией Терраформы), и одной или несколькими конфигурациями терраформ, которые используют существующие изображения.
Если изображения находятся в ведении терраформировать то, что говорит либо о том, что вашей основной конфигурации терраформировать должны принять тот облик, вовсе не существуют и безоговорочно создать его, если ваше решение состоит в том, что изображение принадлежит той же системе, что потребляет его-или ее следует считать, что изображение совсем уже существуют и получения информации о нем с помощью data
блока.
Возможное решение здесь состоит в том, чтобы написать отдельную конфигурацию Terraform, которая управляет изображением, а затем применять эту конфигурацию только в ситуациях, когда ожидается, что этот объект еще не существует. Тогда ваша конфигурация, которая использует существующий образ, может просто предположить, что он существует, не заботясь о том, был ли он создан другой конфигурацией Terraform или нет.
Более подробный обзор этой ситуации содержится в разделе «Состав модуля документации по терраформированию», и, в частности, в подразделе «Условное создание объектов«. Это руководство сосредоточено на взаимодействии между модулями в одной конфигурации, но те же основные принципы применимы и к зависимостям между конфигурациями (через источники данных).