为了自动创建资源组,我想使用一个通用Terraform脚本
例如,下面的脚本根据*.tfvars.json
文件中提供的输入值在Azure中创建资源组
main.tf
# Configure the Microsoft Azure provider
provider "azurerm" {
features {}
}
# Create a Resource Group if it doesn’t exist
resource "azurerm_resource_group" "example" {
name = var.resource_group_name
location = "West US"
}
vars.tf
# Input variable: image sku
variable "resource_group_name" {
description = "Name of the resource group"
default = "example-resources"
}
testing.tfvars.json
{
"resource_group_name":"example-resources-testing"
}
然后执行就像
terraform -自动批准-var-file="testing.tfvars.json“
在创建新资源组之前,它会破坏现有资源组。我不想破坏现有的资源组,只想创建一个新的资源组。
我不想复制剧本。如何在不破坏现有脚本的情况下反复使用通用Terraform脚本?这仅仅是在执行之前禁用或删除状态的问题吗?
其目的是使用ITSM票务系统自动创建资源组,ITSM票务工具将向terraform脚本提供输入,以创建所需的资源。它不应影响现有资源组。
发布于 2022-10-09 23:47:58
首先,让我们回答为什么更改变量要删除旧的资源组(如果您不感兴趣,只是跳到最后一节)。
为什么terraform在变化变量上破坏资源组?
Terraform代码不是“脚本”。--这是你想要的基础设施状态。
因此,如果您更改变量,您就会将您的愿望从拥有resource-group-1
更改为拥有resource-group-2
。您当前的Re欲存储在一个称为状态文件的东西中。为了满足你的愿望,地形必须先移除,再创造另一个。但是有几种方法可以做你想做的事。
解决方案
若要在单个terraform代码中拥有多个资源组,您必须:
多个状态文件(许多小愿望)
首先,您有两个选择:
单一状态文件(一个大愿望)
Terraform还允许您将多个资源组存储在单个状态文件中,因此惟一的方法是迭代资源组名称列表。你的迭代操作符是for_each
。应该是这样的:
variable "resource_group_names" {
description = "Names of the resource groups"
type = set(string)
}
resource "azurerm_resource_group" "example" {
for_each = var.resource_gruop_names
name = each.value
location = "West US"
}
变量是:
{
"resource_group_names":["resource-group-1", "resource-group-2", "resource-group-3"]
}
each
关键字提供key
和value
,但设置相同。有关each
、for_each
等的更多信息,您可以阅读这里
https://stackoverflow.com/questions/73763820
复制相似问题