У меня есть следующая конфигурация:
# 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, что является проблемой.
Какие изменения terraform пытается обновить при подаче заявки? tags
?
@Marcin обновил OP с подробностями плана и тега.
@harshavmb, подробности смотрите в моем редактировании.
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.
Насколько проблематична настройка терраформирования того, что вы установили в ресурсе?
Я не вижу, чтобы блок autoscale
был частью databricks_cluster . Выполнив пробный просмотр кода, я вижу функцию Update
для обнаружения изменений автомасштабирования, которые не используются во время функции Read
. Каково значение блока autoscale
в файле состояния? 8
и 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"
, и вы можете проверить выходные данные плана.
:)
Можете ли вы показать результат плана для изменений?