Terraform применяет внесение изменений в импортированный ресурс в состоянии, когда ресурс не изменился

У меня есть следующая конфигурация:

# Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.25.0"
    }
    databricks = {
      source  = "databricks/databricks"
      version = "1.4.0"
    }
  }

}


provider "azurerm" {
  alias = "uat-sub"
  features {}  
  subscription_id = "sfsdf"
}

provider "databricks" {
  host  = "https://abd-1234.azuredatabricks.net"
  token = "sdflkjsdf"
  alias = "dev-dbx-provider"
}


resource "databricks_cluster" "dev_cluster" {
  cluster_name = "xyz"
  spark_version = "10.4.x-scala2.12"
}

Я могу успешно импортировать databricks_cluster.dev_cluster. После импорта я обновляю свою конфигурацию, чтобы вывести значение из состояния кластера. Обновленный конфиг выглядит так:

# Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.25.0"
    }
    databricks = {
      source  = "databricks/databricks"
      version = "1.4.0"
    }
  }

}


provider "azurerm" {
  alias = "uat-sub"
  features {}  
  subscription_id = "sfsdf"
}

provider "databricks" {
  host  = "https://abd-1234.azuredatabricks.net"
  token = "sdflkjsdf"
  alias = "dev-dbx-provider"
}


resource "databricks_cluster" "dev_cluster" {
  cluster_name = "xyz"
  spark_version = "10.4.x-scala2.12"
}

output "atm"{
   value = databricks_cluster.dev_cluster.autotermination_minutes
}

Когда я запускаю terraform apply для обновленной конфигурации, terrform приступает к обновлению моего импортированного кластера, обнаруживает изменения и выполняет «обновление на месте», когда некоторые значения в моем кластере устанавливаются нулевыми (autoscale/pyspark_env и т. д.). Все это происходит, когда в кластере фактически не вносятся никакие изменения. Почему это происходит? Почему terraform сбрасывает некоторые значения, если не было внесено никаких изменений?

РЕДАКТИРОВАТЬ - вывод «плана терраформирования»:

C:\Users\>terraform plan
databricks_cluster.dev_cluster: Refreshing state... [id=gyht]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # databricks_cluster.dev_cluster will be updated in-place
  ~ resource "databricks_cluster" "dev_cluster" {
      ~ autotermination_minutes      = 10 -> 60
      - data_security_mode           = "NONE" -> null
        id                           = "gyht"
      ~ spark_env_vars               = {
          - "PYSPARK_PYTHON" = "/databricks/python3/bin/python3" -> null
        }
        # (13 unchanged attributes hidden)

      - autoscale {
          - max_workers = 8 -> null
          - min_workers = 2 -> null
        }

      - cluster_log_conf {
          - dbfs {
              - destination = "dbfs:/cluster-logs" -> null
            }
        }

        # (2 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

РЕДАКТИРОВАТЬ. Обойти жестко закодированные теги:

resource "databricks_cluster" "dev_cluster" {
  cluster_name = "xyz"
  spark_version = "10.4.x-scala2.12"
  autotermination_minutes = 10
  data_security_mode = "NONE"
  autoscale {
    max_workers = 8
    min_workers = 2
   }
   cluster_log_conf {
      dbfs {
        destination = "dbfs:/cluster-logs"
      }
    }
    spark_env_vars = {
          PYSPARK_PYTHON = "/databricks/python3/bin/python3"
    }
}

Обходной путь частично работает, поскольку я больше не вижу, чтобы terraform пытался сбросить теги при каждом применении. Но если я изменю любой из тегов в кластере, допустим, я изменю максимальное количество рабочих процессов на 5, terraform не будет обновлять состояние, чтобы отразить 5 рабочих процессов. TF заменит 5 жестко запрограммированным 8, что является проблемой.

Можете ли вы показать результат плана для изменений?

Marcin 10.10.2022 09:37

Какие изменения terraform пытается обновить при подаче заявки? tags?

harshavmb 10.10.2022 09:47

@Marcin обновил OP с подробностями плана и тега.

sotn 10.10.2022 15:55

@harshavmb, подробности смотрите в моем редактировании.

sotn 10.10.2022 15:56
But if I were to change any of the tags on the cluster, lets says I change max workers to 5, terraform will not update state to reflect 5 workers. TF will override 5 with the hard coded 8, which is an issue. Насколько проблематична настройка терраформирования того, что вы установили в ресурсе?
ravenwing 13.10.2022 03:19

Я не вижу, чтобы блок autoscale был частью databricks_cluster . Выполнив пробный просмотр кода, я вижу функцию Update для обнаружения изменений автомасштабирования, которые не используются во время функции Read. Каково значение блока autoscale в файле состояния? 8 и 2 соответственно?

harshavmb 17.10.2022 09:28
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
6
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы ответить на первую часть вашего вопроса, Terraform импортирует фактические значения вашего кластера в файл состояния, но не может импортировать эти значения в ваш файл конфигурации (.hcl), поэтому вам нужно указать их вручную (как вы сделали ).

Не устанавливая необязательные поля, вы фактически говорите «установите для этих полей значение по умолчанию», которое в большинстве случаев равно null (за исключением поля autotermination_minutes, которое имеет значение по умолчанию 60), поэтому Terraform обнаруживает дрейф между ваше состояние и ваша конфигурация. (фактические значения из импорта по сравнению со значениями по умолчанию для неуказанных полей).

Для справки: https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/cluster

Что касается второй части вашего вопроса, вы говорите

скажем, я изменяю максимальное количество рабочих на 5, terraform не будет обновлять состояние, чтобы отразить 5 рабочих.

если вы имеете в виду, что вы изменяете максимальное количество рабочих из-за пределов Terraform, то Terraform спроектирован так, чтобы переопределять это поле при запуске terraform apply. При работе с Terraform, если вы хотите внести изменения в свою инфраструктуру, вы всегда хотите внести изменения в конфигурацию Terraform и запустить terraform apply, чтобы внести эти изменения за вас.

Так что в вашем случае, если вы хотите изменить max_workers на 5, вы должны установить это значение в конфигурации terraform и запустить terraform apply. Вы бы не сделали это из Databricks. Если такое поведение проблематично, я бы спросил, хотите ли вы управлять этим ресурсом с помощью Terraform, поскольку Terraform всегда будет работать именно так.

Надеюсь, это поможет!

Это касается изменений тега max_worker, надеюсь, у вас есть файл var.tf и если вы упомянули var "max" {default=8} в var.tf.

Затем вы можете явно переопределить это значение, указав необходимое значение при применении плана, например terraform plan -var = "max=5", и вы можете проверить выходные данные плана. :)

Другие вопросы по теме