Terraform-如何避免使用单一状态文件进行销毁和创建。

问题描述 投票:-1回答:1

我有一个terraform代码,可以创建一个流分析工作,也有一个工作的输入和输出。以下是我的terraform代码。

provider "azurerm" {
  version = "=1.44"
}
resource "azurerm_stream_analytics_job" "test_saj" {
  name                                     = "test-stj"
  resource_group_name                      = "myrgname"
  location                                 = "Southeast Asia"
  compatibility_level                      = "1.1"
  data_locale                              = "en-US"
  events_late_arrival_max_delay_in_seconds = 60
  events_out_of_order_max_delay_in_seconds = 50
  events_out_of_order_policy               = "Adjust"
  output_error_policy                      = "Drop"
  streaming_units                          = 3

  tags = {
    environment = "test"
  }
  transformation_query = var.query

}
resource "azurerm_stream_analytics_output_blob" "mpl_saj_op_jk_blob" {
  name                      = var.saj_jk_blob_output_name
  stream_analytics_job_name = "test-stj"
  resource_group_name       = "myrgname"
  storage_account_name      = "mystaname"
  storage_account_key       = "mystakey"
  storage_container_name    = "testupload"
  path_pattern              = myfolder/{day}"
  date_format               = "yyyy-MM-dd"
  time_format               = "HH"

  depends_on = [azurerm_stream_analytics_job.test_saj]

  serialization {
    type            = "Json"
    encoding        = "UTF8"
    format  = "LineSeparated"
  }
}
resource "azurerm_stream_analytics_stream_input_eventhub" "mpl_saj_ip_eh" {
  name                         = var.saj_joker_event_hub_name
  stream_analytics_job_name    = "test-stj"
  resource_group_name          = "myrgname"
  eventhub_name                = "myehname"
  eventhub_consumer_group_name = "myehcgname"
  servicebus_namespace         = "myehnamespacename"
  shared_access_policy_name    = "RootManageSharedAccessKey"
  shared_access_policy_key     = "ehnamespacekey"

      serialization {
        type     = "Json"
        encoding = "UTF8"
      }
      depends_on = [azurerm_stream_analytics_job.test_saj]
    }

以下是我的tfvars输入文件。

query=<<EOT
myqueryhere
EOT
saj_jk_blob_output_name="outputtoblob01"
saj_joker_event_hub_name="inputventhub01"

我的创建没有问题 现在我的问题是,当我想为同一个流分析工作创建一个新的输入和输出时,我改变了tfvars文件中的名称值,并给terraform应用(在第一次应用的同一目录下。 同样的状态文件)。

Terraform用新的ip和op替换了现有的ip和op,这不是我的要求。我希望旧的和新的都有。当我在一个完全不同的文件夹中使用terraform import导入现有的流分析时,我使用了相同的代码,满足了这个用例。但是,有没有办法不用terraform导入也能做到这一点。能否用一个状态文件本身来完成?

azure terraform azure-stream-analytics terraform-provider-azure
1个回答
1
投票

状态允许Terraform知道要添加、更新或删除哪些Azure资源。你想做的事情不能用一个状态文件本身来完成,除非你直接在配置文件中部署不同名称的资源。

例如,如果你想创建两个虚拟网络。你可以直接创建这样的资源,或者使用一个 count 循环的资源级别的参数。

resource "azurerm_virtual_network" "example" {
  name                = "examplevnet1"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  address_space       = ["10.1.0.0/16"]
}

resource "azurerm_virtual_network" "example" {
  name                = "examplevnet2"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  address_space       = ["10.2.0.0/16"]
}

当在团队中使用Terraform时,你可以使用 遥远的国度 将状态数据写入远程数据存储,然后可以在团队的所有成员之间共享。建议使用 在 Azure 存储中存储 Terraform 状态.

欲了解更多信息,你可以看到Terraform的工作流程在 本博客.

© www.soinside.com 2019 - 2024. All rights reserved.