对于我当前的项目,我已经使用Terraform在Azure上部署了一个Databricks工作区,并且我正在尝试创建一个额外的工作区。我的代码存储库基于几个模块,并且我希望使用Terraform向我的Azure订阅添加额外的工作区。但是,事情并没有按照我希望的方式发展,因为我无法为不同的工作空间创建集群。创建数据块工作空间不是问题,创建相关的数据块提供程序资源才是问题。
目录结构(我有其他模块,但没有包括在内,因为它们与此问题无关):
.
|-config
| |-dev.tfvars
|-main.tf
|-outputs.tf
|-providers.tf
|-variables.tf
|-modules
| |-db-cluster
| | |-main.tf
| | |-outputs.tf
| | |-variables.tf
| |-dbw
| | |-main.tf
| | |-outputs.tf
| | |-variables.tf
| |-network
| | |-main.tf
| | |-outputs.tf
| | |-variables.tf
利用这些模块,我使用main.tf根文件夹中的www.example.com文件来确定模块,然后这些模块将创建(基于诸如count之类的东西)相关的资源。
例如,在下面的main.tf文件中,我们确定了数据块工作区模块(dbw)和数据块集群模块(db-cluster)。
# ./main.tf file in the root module
# Databricks workspace
module "dbw-default" {
count = length(var.dbw-names)
source = "./modules/dbw"
dbw-name = var.dbw-names[count.index]
dbw-project = var.project
dbw-env = var.env
dbw-resource-group-name = module.rg-default[index(var.rg-names, "databricks")].name
dbw-location = var.location
dbw-sku = var.dbw-sku
dbw-tags = merge(var.tags, { "purpose" = "databricks", "env" = var.env })
}
# Databricks Cluster
module "db-cluster-default" {
source = "./modules/db-cluster"
db-cluster-name = var.db-cluster-name
db-cluster-env = var.env
db-cluster-project = var.db-cluster-project
db-cluster-tags = merge(var.tags, { "purpose" = "databricks", "env" = var.env })
db-cluster-min-workers = var.db-cluster-min-workers
db-cluster-max-workers = var.db-cluster-max-workers
db-cluster-autotermination-minutes = var.db-cluster-autotermination-minutes
}
这与main.tfdbw模块中的www.example.com(如下所述)一起使用azure_rm提供程序创建了databricks工作区。
# ./modules/dbw/main.tf
resource "azurerm_databricks_workspace" "default" {
name = format("dbw-%s-%s-%s", var.dbw-name, var.dbw-project, var.dbw-env)
resource_group_name = var.dbw-resource-group-name
location = var.dbw-location
sku = var.dbw-sku
tags = var.dbw-tags
}
最后是databricks集群模块,其中再次指定了provider。
# ./modules/db-cluster/main.tf
terraform {
required_providers {
databricks = {
source = "databricks/databricks"
version = "~> 1.6"
}
}
}
resource "databricks_cluster" "shared_autoscaling" {
cluster_name = format("db-cluster-%s-%s", var.db-cluster-project, var.db-cluster-env)
spark_version = data.databricks_spark_version.latest_lts.id
node_type_id = data.databricks_node_type.smallest.id
autotermination_minutes = var.db-cluster-autotermination-minutes
autoscale {
min_workers = var.db-cluster-min-workers
max_workers = var.db-cluster-max-workers
}
}
这与根模块中的providers块相关:
# ./providers.tf
# providers and versions
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.29"
}
databricks = {
source = "databricks/databricks"
version = "~> 1.6"
}
}
backend "azurerm" {
# environment variables are available from YAML pipeline to authenticate using service principal.
}
}
provider "azurerm" {
features {}
}
provider "databricks" {
azure_workspace_resource_id = module.dbw-default.id
}
所以当我在module.dbw-default.id这个provider块中把www.example.com改成module.dbw-default[0].id的时候,我没有成功。完全忽略这里的引用,只在db-cluster模块级别使用它也没有成功。我得到了下面的错误信息:
Error: cannot read cluster: cannot configure azure-client-secret auth: cannot get workspace: please set `azure_workspace_resource_id` provider argument.
首先我尝试引用module.dbw-default[0].id,并尝试了几种不同的方法,但都不起作用。此外,我尝试将数据库的terraform提供程序块移到db-cluster模块,并将dbw-id传递到提供程序中引用。但这也不起作用。我将非常感谢任何帮助!我想强调的是,当使用单个工作空间时,这一切都工作得很好,但不再使用多个工作空间。
一开始我试着引用模块.dbw-default[0].id并尝试了几种变体,但都不起作用。此外,我试着将数据块的terraform提供程序块移到db-cluster模块,但也不起作用。
1条答案
按热度按时间xoefb8l81#
好吧,这让我有点困惑。简短的回答是,不可能动态地设置提供者。这意味着使用for_each指定数据库工作区意味着您不能为这些工作区动态地创建集群(或为它们配置其他任何东西)。这与Terraform的配置方式有关。有关详细信息,请参阅GitHub问题here。
现在该如何前进:如果工作空间的数量有限,我们可以通过简单地复制根文件www.example.com中的代码块来显式定义它们(例如
dbw-default-first
、dbw-default-second
)main.tf。然后在providers.tf文件中,我们可以使用不同的别名列出数据库提供程序的多个副本:然后,在www.example.com文件中配置群集或其他数据库设置时main.tf,我们添加特定的提供程序:
类似地,也将其添加到第二个数据块集群中。这种解决方案的不幸之处在于,我们必须对每个副本进行硬编码,这是一个丑陋的解决方案。不幸的是,这是唯一可行的选择,因为我们不能动态地指定它。