重用配置在 Terraform 中创建类似的资源
Reuse the configuration to create similar resources in Terraform
我有以下 TF 文件,它将创建一个函数 - FirstFunction。这非常有效。
resource "azurerm_function_app" "**firstfunction**" {
name = **var.firstfunctionname**
location = azurerm_resource_group.resourcegroupX.location
resource_group_name = azurerm_resource_group.resourcegroupX.name
app_service_plan_id = azurerm_app_service_plan.appserviceplan.id
https_only = "true"
client_affinity_enabled = "true"
app_settings = {
NS = azurerm_eventhub_namespace.eventhubns.name
Hub = azurerm_eventhub.**firsteventhub**.name
propertyX = "**firstproperty**"
LogRef = "${azurerm_storage_account.store.primary_blob_endpoint}${azurerm_storage_container.**firstlogs**.name}"
}
}
resource "azurerm_app_service_virtual_network_swift_connection" "**firstvnet**" {
app_service_id = azurerm_function_app.**firstfunction**.id
subnet_id = azurerm_subnet.snet.id
}
在文件中,查看带 **** 的部分,需要更改以创建 SecondFunction、ThirdFunction 等...
我现在的方法是创建多个 TF 文件,复制相同的代码并更改 ** 中包含的部分。
我通读了模块系统,但了解到模块系统的局限性在于我无法引用在同一 TF 根模块中创建的其他组件,如下所示
例如,在 TF 文件中,我将位置称为
位置 = azurerm_resource_group.resourcegroupX.location
如果我把它作为一个模块来做,这个位置应该被称为
location = var.location_name 其中 location_name 应定义为变量。我无法引用使用相同根模块创建的组件。
能否建议一个解决方案,让我可以基于相似的代码创建多个组件?请注意,在上面的示例中,我在单个 TF 文件中创建了 2 个资源,并且它们都是相关的。
最简单的方法是在您的资源中使用计数 属性。它可以帮助您在同一代码中创建多个相同的资源。
resource "azurerm_function_app" "myfunction" {
count = number_your_need # how many resources you want to create
name = "${var.firstfunctionname}-${count.index}"
location = azurerm_resource_group.resourcegroupX.location
resource_group_name = azurerm_resource_group.resourcegroupX.name
app_service_plan_id = azurerm_app_service_plan.appserviceplan.id
https_only = "true"
client_affinity_enabled = "true"
app_settings = {
NS = azurerm_eventhub_namespace.eventhubns.name
Hub = azurerm_eventhub.**firsteventhub**.name
propertyX = "**firstproperty**"
LogRef = "${azurerm_storage_account.store.primary_blob_endpoint}${azurerm_storage_container.**firstlogs**.name}"
}
}
resource "azurerm_app_service_virtual_network_swift_connection" "**firstvnet**" {
count = number # how many you need to create
app_service_id = element(azurerm_function_app.myfunction[*].id, count.index)
subnet_id = azurerm_subnet.snet.id
}
您需要为 azurerm_eventhub
创建相同的解决方案。例如:
resource "azurerm_eventhub" "myeventhub" {
count = number # how many you need to create
name = "${var.eventhub_name}-${count.index}"
...
}
然后你可以在函数应用中这样引用它:
app_settings = {
NS = azurerm_eventhub_namespace.eventhubns.name
Hub = element(azurerm_eventhub.myeventhub[*].name, count.index)
propertyX = "**firstproperty**"
LogRef = "${azurerm_storage_account.store.primary_blob_endpoint}${azurerm_storage_container.**firstlogs**.name}"
}
所有带 **** 的部分也是如此。
我有以下 TF 文件,它将创建一个函数 - FirstFunction。这非常有效。
resource "azurerm_function_app" "**firstfunction**" {
name = **var.firstfunctionname**
location = azurerm_resource_group.resourcegroupX.location
resource_group_name = azurerm_resource_group.resourcegroupX.name
app_service_plan_id = azurerm_app_service_plan.appserviceplan.id
https_only = "true"
client_affinity_enabled = "true"
app_settings = {
NS = azurerm_eventhub_namespace.eventhubns.name
Hub = azurerm_eventhub.**firsteventhub**.name
propertyX = "**firstproperty**"
LogRef = "${azurerm_storage_account.store.primary_blob_endpoint}${azurerm_storage_container.**firstlogs**.name}"
}
}
resource "azurerm_app_service_virtual_network_swift_connection" "**firstvnet**" {
app_service_id = azurerm_function_app.**firstfunction**.id
subnet_id = azurerm_subnet.snet.id
}
在文件中,查看带 **** 的部分,需要更改以创建 SecondFunction、ThirdFunction 等...
我现在的方法是创建多个 TF 文件,复制相同的代码并更改 ** 中包含的部分。
我通读了模块系统,但了解到模块系统的局限性在于我无法引用在同一 TF 根模块中创建的其他组件,如下所示 例如,在 TF 文件中,我将位置称为 位置 = azurerm_resource_group.resourcegroupX.location 如果我把它作为一个模块来做,这个位置应该被称为 location = var.location_name 其中 location_name 应定义为变量。我无法引用使用相同根模块创建的组件。
能否建议一个解决方案,让我可以基于相似的代码创建多个组件?请注意,在上面的示例中,我在单个 TF 文件中创建了 2 个资源,并且它们都是相关的。
最简单的方法是在您的资源中使用计数 属性。它可以帮助您在同一代码中创建多个相同的资源。
resource "azurerm_function_app" "myfunction" {
count = number_your_need # how many resources you want to create
name = "${var.firstfunctionname}-${count.index}"
location = azurerm_resource_group.resourcegroupX.location
resource_group_name = azurerm_resource_group.resourcegroupX.name
app_service_plan_id = azurerm_app_service_plan.appserviceplan.id
https_only = "true"
client_affinity_enabled = "true"
app_settings = {
NS = azurerm_eventhub_namespace.eventhubns.name
Hub = azurerm_eventhub.**firsteventhub**.name
propertyX = "**firstproperty**"
LogRef = "${azurerm_storage_account.store.primary_blob_endpoint}${azurerm_storage_container.**firstlogs**.name}"
}
}
resource "azurerm_app_service_virtual_network_swift_connection" "**firstvnet**" {
count = number # how many you need to create
app_service_id = element(azurerm_function_app.myfunction[*].id, count.index)
subnet_id = azurerm_subnet.snet.id
}
您需要为 azurerm_eventhub
创建相同的解决方案。例如:
resource "azurerm_eventhub" "myeventhub" {
count = number # how many you need to create
name = "${var.eventhub_name}-${count.index}"
...
}
然后你可以在函数应用中这样引用它:
app_settings = {
NS = azurerm_eventhub_namespace.eventhubns.name
Hub = element(azurerm_eventhub.myeventhub[*].name, count.index)
propertyX = "**firstproperty**"
LogRef = "${azurerm_storage_account.store.primary_blob_endpoint}${azurerm_storage_container.**firstlogs**.name}"
}
所有带 **** 的部分也是如此。