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会继续刷新我导入的集群并检测更改,并在集群上的一些值设置为null的地方进行"就地更新"(autoscale/pyspark_env等(。所有这些都发生在集群上实际没有进行任何更改的情况下。为什么会发生这种情况?为什么地形在没有进行任何更改的情况下重置某些值?

编辑-"地形图"输出:

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,地形将不会更新状态以反映5个工人。TF将用硬编码的8覆盖5,这是一个问题。

为了回答问题的第一部分,Terraform已经将集群的实际值导入到状态文件中,但它无法为您将这些值导入到配置文件(.hcl(中,因此您需要手动指定它们(正如您所做的那样(。

通过不设置可选字段,您实际上是在说";将那些字段设置为默认值"0";在大多数情况下是null(除了默认为60autotermination_minutes字段(,这就是为什么Terraform检测到您的状态和配置之间的漂移。(导入的实际值与未指定字段的默认值(。

供参考:https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/cluster

对于问题的第二部分,你说

让我们说我将最大工人数更改为5,地形不会更新状态以反映5个工人。

如果您的意思是从Terraform外部更改最大工作人员,那么Terraform被设计为在运行terraform apply时覆盖该字段。使用Terraform时,如果您想更改基础设施,您总是希望在Terraform配置中进行更改,并运行terraform apply为您进行这些更改。

因此,在您的情况下,如果您想将max_workers更改为5,您可以在terraform配置中设置该值并运行terraform apply。您不会在Databricks中执行此操作。如果这种行为有问题,我会质疑你是否想用Terraform管理资源,因为Terraform总是这样工作的。

希望能有所帮助!

这是关于max_worker标记的更改,希望您有var.tf文件,如果您在var.tf中提到了var "max" {default=8}

然后,您可以通过在应用计划(如terraform plan -var="max=5"(时提供所需的值来显式覆盖此值,并可以签入计划输出。:(

最新更新