Module enabling to deploy based on a specific variable ( Terraform/Datadog )

377 Views Asked by At

I'm looking to automate on specific part based on a very complicated Terraform script that I have.

To make a bit clear I have created TF template with Deployment of entire infra into Azure with App Services, Storage account, Security groups, Windows based VM's, Linux based VM's split for MongoDB and RabbitMQ. Inside my script I was able to automate deployment to use the name of the application and create Synthetic Test and using a local variable plus based on to the environment to use a specific Datadog Key using the local variable ability

keyTouse = lower(var.environment) != "production" ? var.DatadogNPD : var.DatadogPRD

right now the point that bothers me is the following.

Since we are not in a need to use Synthetic tests based on NON Production environment i would like to use some sort of logic and not deploy Synthetic tests if the var.environment is not "PRODUCTION"

To make this part more interesting i also have the ability to deploy multiple Synthetic Test using the "count" and "length" shown below

inside main.tf

module "Datadog" {
  source = "./Datadog"
webapp_name = [ azurerm_linux_web_app.service1.name, azurerm_linux_web_app.service2.name ]
}

and for Datadog Synthetic Test

resource "datadog_synthetics_test" "app_service_monitoring" {
  count = length(var.webapp_name)

  type    = "api"
  subtype = "http"
  request_definition {
    method = "GET"
    url    = "https://${element(var.webapp_name, count.index)}.azurewebsites.net/health"
  }

Could you help me and suggest how can I enable or disable modules deployment using the variable based on environment?

1

There are 1 best solutions below

1
On BEST ANSWER

Based on my understanding of the question, the change would have to be two-fold:

  1. Add an environment variable to the module code
  2. Use that variable for deciding if the synthetics test resource should be created or not

The above translates to creating another variable in the module and later on providing that variable a value when calling the module. The last part would be deciding based on that if the resource gets created.

# module level variable
variable "environment" {
  type        = string
  description = "Environment in which to deploy resources."
}

Then, in the resource, you would add the following:

resource "datadog_synthetics_test" "app_service_monitoring" {
  count = var.environment == "production" ? length(var.webapp_name) : 0

  type    = "api"
  subtype = "http"
  request_definition {
    method = "GET"
    url    = "https://${element(var.webapp_name, count.index)}.azurewebsites.net/health"
  }
}

And finally, in the root module:

module "Datadog" {
  source = "./Datadog"
  webapp_name = [ azurerm_linux_web_app.service1.name, azurerm_linux_web_app.service2.name ]
  environment = var.environment
}

The environment = var.environment line will work if you have also defined the variable environment in the root module. If not you can always set it to a value you want:

module "Datadog" {
  source = "./Datadog"
  webapp_name = [ azurerm_linux_web_app.service1.name, azurerm_linux_web_app.service2.name ]
  environment = "dev" # <--- or "production" or any other environment you have
}