С террафом вы можете указать, когда вам понравится примененный ресурс. Например, используя следующий ресурс будет запущен только при нацелении этого плана для уничтожения:
data "external" "create_cluster" { program = ["python3", "${path.module}/scripts/create_cluster.py"] query = { du_fqdn = var.cluster_fqdn user = var.cluster_user pw = var.cluster_password tenant = var.cluster_tenant region = var.cluster_region cluster_name = var.cluster_name k8s_api_fqdn = metal_reserved_ip_block.cluster_ip.address allow_workloads_on_master = var.allow_workloads_on_master } } resource "null_resource" "delete_cluster" { provisioner "local-exec" { when = destroy command = "printf '{\"du_fqdn\": \"${var..cluster_fqdn}\", \"user\": \"${var..cluster_user}\", \"pw\": \"${var..cluster_password}\", \"tenant\": \"${var..cluster_tenant}\", \"region\": \"${var..cluster_region}\", \"cluster_uuid\": \"${lookup(data.external.create_cluster.result, "cluster_id")}\"}' | python3 ${path.module}/scripts/delete_cluster.py" environment = { du_fqdn = var.cluster_fqdn user = var.cluster_user pw = var.cluster_password tenant = var.cluster_tenant region = var.cluster_region cluster_uuid = lookup(data.external.create_cluster.result, "cluster_id") } } }
В этом случае мы хотим результат нашего create_cluster
источник данных. Однако в Terraform 0.13+ вы больше не можете ссылаться на данные таким образом, и когда вы пытаетесь, вы получаете фатальную ошибку:
Error: Invalid reference from destroy provisioner Destroy-time provisioners and their connection configurations may only reference attributes of the related resource, via 'self', 'count.index', or 'each.key'. References to other resources during the destroy phase can cause dependency cycles and interact poorly with create_before_destroy.
Это означает, что, если вы хотите продолжать ссылаться на эти внешние данные внутри Provisioner Time Time, для того, чтобы эти значения были доступны, вам просто нужно немного изменить вышеупомянутую Null_Resource:
Во-первых, нам нужно, до блока проведения, определите карту триггеров, поэтому, когда Terraform может ссылаться на эти объекты в рамках своего класса, когда это происходит событие, поэтому для того, чтобы, например, ссылку на ваши переменные, ваша карта должна выглядеть нравится:
resource "null_resource" "delete_cluster" { triggers = { cluster_uuid = lookup(data.external.create_cluster.result, "cluster_id") cluster_fqdn = var.cluster_fqdn cluster_user = var.cluster_user cluster_password = var.cluster_password cluster_tenant = var.cluster_tenant cluster_region = var.cluster_region }
А затем ссылаться на них в плане, вы просто используете Self.triggers. [Key]:
provisioner "local-exec" { when = destroy command = "printf '{\"du_fqdn\": \"${self.triggers.cluster_fqdn}\", \"user\": \"${self.triggers.cluster_user}\", \"pw\": \"${self.triggers.cluster_password}\", \"tenant\": \"${self.triggers.cluster_tenant}\", \"region\": \"${self.triggers.cluster_region}\", \"cluster_uuid\": \"${self.triggers.cluster_uuid}\"}' | python3 ${path.module}/scripts/delete_cluster.py" environment = { du_fqdn = self.triggers.cluster_fqdn user = self.triggers.cluster_user pw = self.triggers.cluster_password tenant = self.triggers.cluster_tenant region = self.triggers.cluster_region cluster_uuid = self.triggers.cluster_uuid } } }
Подробнее о других концернах Terraform (до 0,13 и помимо) проблемы могут быть найдены здесь Отказ
Оригинал: «https://dev.to/jmarhee/upgrading-terraform-destroy-time-provisioners-50p7»