Рубрики
Uncategorized

Обновление террафом разрушения временных времен

С террафом вы можете указать, когда вам понравится примененный ресурс. Например, используя … Помечено систематизированию систематизации, Terraform, DevOps, Go.

С террафом вы можете указать, когда вам понравится примененный ресурс. Например, используя следующий ресурс будет запущен только при нацелении этого плана для уничтожения:

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»