【问题标题】:Terraform apply making changes to imported resource in state when resource has not changed当资源未更改时,Terraform 应用对状态中的导入资源进行更改
【发布时间】:2022-10-19 04:09:41
【问题描述】:

我有以下配置:

# 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 将用硬编码的 8 覆盖 5,这是一个问题。

【问题讨论】:

  • 您可以显示计划的更改输出吗?
  • 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. terraform 如何设置您在资源中设置的内容是一个问题?

标签: azure terraform resources state databricks


【解决方案1】:

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

通过不设置可选字段,您实际上是在说“将这些字段设置为默认值”,在大多数情况下为nullautotermination_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 始终是这样工作的。

希望有帮助!

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多