Terraform 仅当vars.tf文件中的变量设置为true时,才创建main.tf资源

Terraform 仅当vars.tf文件中的变量设置为true时,才创建main.tf资源,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,我通常有一个通用的main.tf文件,它是我们环境中所有部署的基础(DEV/STAGING/LIVE)。对于这些环境,我有一个parameter.tf文件 在登台和实时环境中,总是需要启用一些比开发人员可能启用的更昂贵的Azure选项—在我的示例中,是启用Azure Defender for SQL和Azure SQL Server(PaaS)的扩展审核功能 这是我的main.tf文件的一部分,它是通用的 # Define SQL Server resource "azurerm_m

我通常有一个通用的main.tf文件,它是我们环境中所有部署的基础(DEV/STAGING/LIVE)。对于这些环境,我有一个parameter.tf文件

在登台和实时环境中,总是需要启用一些比开发人员可能启用的更昂贵的Azure选项—在我的示例中,是启用Azure Defender for SQL和Azure SQL Server(PaaS)的扩展审核功能

这是我的main.tf文件的一部分,它是通用的

# Define SQL Server 
resource "azurerm_mssql_server" "example" {
  name                          = var.azsqlserver1name
  resource_group_name           = azurerm_resource_group.example.name
  location                      = azurerm_resource_group.example.location
  version                       = var.azsqlserver1version
  administrator_login           = var.azsqlserver1sauser
  administrator_login_password  = random_password.sql-password.result
  public_network_access_enabled = "true" # set to false with vNet integration
}

# Define Storage Account and container for SQL Threat Detection Policy Audit Logs 
resource "azurerm_storage_account" "example" {
  name                     = var.azsaname1
  resource_group_name      = azurerm_resource_group.example.name
  location                 = azurerm_resource_group.example.location
  account_tier             = var.azsatier1
  account_replication_type = var.azsasku1
  access_tier              = var.azsaaccesstier1
  account_kind             = var.azsakind1
  enable_https_traffic_only  = "true"
}
resource "azurerm_storage_container" "example" {
  name                  = "vascans"
  storage_account_name  = azurerm_storage_account.example.name
  container_access_type = "private"
}

# Defines Azure SQL Defender and Auditing - NOTE: Auditing - only SA out at the moment (11/2020) - Log Analytics and Event Hub in preview only
resource "azurerm_mssql_server_security_alert_policy" "example" {
  resource_group_name        = azurerm_resource_group.example.name
  server_name                = azurerm_mssql_server.example.name
  state                      = var.azsqltreatdetectionstate
  storage_endpoint           = azurerm_storage_account.example.primary_blob_endpoint
  storage_account_access_key = azurerm_storage_account.example.primary_access_key
  email_account_admins       = var.azsqltreatdetectionemailadmins
  retention_days             = var.azsqltreatdetectionretention
}
resource "azurerm_mssql_server_vulnerability_assessment" "example" {
  server_security_alert_policy_id = azurerm_mssql_server_security_alert_policy.example.id
  storage_container_path          = "${azurerm_storage_account.example.primary_blob_endpoint}${azurerm_storage_container.example.name}/"
  storage_account_access_key      = azurerm_storage_account.example.primary_access_key
  recurring_scans {
    enabled                   = var.azsqlvscansrecurring
    email_subscription_admins = var.azsqlvscansemailadmins
  }
}
resource "azurerm_mssql_server_extended_auditing_policy" "example" {
  server_id                               = azurerm_mssql_server.example.id
  storage_endpoint                        = azurerm_storage_account.example.primary_blob_endpoint
  storage_account_access_key              = azurerm_storage_account.example.primary_access_key
  storage_account_access_key_is_secondary = false
  retention_in_days                       = var.azsqlauditretentiondays
}
我需要做的是,在第一个azurerm\u mssql\u服务器“资源之后,只在STAGING and LIVE(而不是DEV)中创建任何内容。我计划在DEV/STAGING/liveparmtf文件中有一个变量,该变量的状态类似于

DEVparm.tf

variable azsqlenableazuredefenderforsql {
  default="false"
}
variable azsqlenableazuredefenderforsql {
  default="true"
}
STAGINGparm.tf和LIVEparm.tf

variable azsqlenableazuredefenderforsql {
  default="false"
}
variable azsqlenableazuredefenderforsql {
  default="true"
}

这是否可能实现?到目前为止,我已经画了一个空白,并测试了一些东西,但它们并不完全有效。这似乎是一个足够简单的愿景,但当没有如果。。。语句

如果您需要打开和关闭资源,使用count=1或0很容易实现。这通常用三元运算符处理

resource "some_resource" "example" {
 count = terraform.workspace != "development" ? 1 : 0
}

count参数已添加到terraform 0.13的模块中。如果您有一个资源包,那么它可能是一种替代方法,可以将某些资源排除在建筑之外。

如果您需要打开和关闭资源,使用count=1或0很容易实现。这通常用三元运算符处理

resource "some_resource" "example" {
 count = terraform.workspace != "development" ? 1 : 0
}

count参数已添加到terraform 0.13的模块中。如果您有一个资源包,那么它可能是一种将某些资源排除在建筑之外的替代方法。

许多人解决这一问题的一种方法是将资源上的
count
参数与三元数组合。例如,请参阅中标题为“带有count参数的If语句”的部分

基本上,您可以保留
azsqlenableazuredefenderforsql
变量,然后在资源中执行以下操作:

resource "azurerm_storage_container" "example" {
  count                 = var.azsqlenableazuredefenderforsql ? 1 : 0
  name                  = "vascans"
  storage_account_name  = azurerm_storage_account.example.name
  container_access_type = "private"
}

很多人解决这个问题的一种方法是将资源上的
count
参数与三元数组合。例如,请参阅中标题为“带有count参数的If语句”的部分

基本上,您可以保留
azsqlenableazuredefenderforsql
变量,然后在资源中执行以下操作:

resource "azurerm_storage_container" "example" {
  count                 = var.azsqlenableazuredefenderforsql ? 1 : 0
  name                  = "vascans"
  storage_account_name  = azurerm_storage_account.example.name
  container_access_type = "private"
}

谢谢-我昨天在这里发帖之前就试过了。不幸的是,我没有从中得到那么多的快乐——这似乎是个问题。我的主要问题是,SA也隐含在代码的其他部分,这涉及到在资源标签后面放置大量的[1]…例如。示例[1]。谢谢-我昨天在这里发布之前尝试过这个。不幸的是,我没有从中得到那么多的快乐——这似乎是个问题。我的主要问题是,SA也隐含在代码的其他部分,这涉及到在资源标签后面放置大量的[1]…例如。示例[1]。