Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Terraform use case to create multiple almost identical copies of infrastructure

Tags:

terraform

I have TF templates whose purpose is to create multiple copies of the same cloud infrastructure. For example you have multiple business units inside a big organization, and you want to build out the same basic networks. Or you want an easy way for a developer to spin up the stack that he's working on. The only difference between "tf apply" invokations is the variable BUSINESS_UNIT, for example, which is passed in as an environment variable.

Is anyone else using a system like this, and if so, how do you manage the state files ?

like image 815
Balazs Rau Avatar asked Oct 01 '16 04:10

Balazs Rau


People also ask

How can we reuse Terraform code for multiple environments?

With Terraform, you can put your code inside of a Terraform module and reuse that module in multiple places throughout your code. Instead of having the same code copied and pasted in the staging and production environments, you'll be able to have both environments reuse code from the same module: This is a big deal.

How does Terraform handle multiple TF files?

Multiple Files Deployment Model When Terraform is planning, applying or destroying resources, it searches for valid *. tf files in the directory, if it finds, then all of them are combined automatically into a single file to be deployed.

Can you have multiple Terraform blocks?

Terraform does not ascribe any special meaning to which filenames you use and how many files you have. Terraform instead reads all of the . tf files and considers their contents together. Therefore you can freely move the blocks from your main.tf file into as many separate .


1 Answers

You should use a Terraform Module. Creating a module is nothing special: just put any Terraform templates in a folder. What makes a module special is how you use it.

Let's say you put the Terraform code for your infrastructure in the folder /terraform/modules/common-infra. Then, in the templates that actually define your live infrastructure (e.g. /terraform/live/business-units/main.tf), you could use the module as follows:

module "business-unit-a" {
  source = "/terraform/modules/common-infra"
}

To create the infrastructure for multiple business units, you could use the same module multiple times:

module "business-unit-a" {
  source = "/terraform/modules/common-infra"
}

module "business-unit-b" {
  source = "/terraform/modules/common-infra"
}

module "business-unit-c" {
  source = "/terraform/modules/common-infra"
}

If each business unit needs to customize some parameters, then all you need to do is define an input variable in the module (e.g. under /terraform/modules/common-infra/vars.tf):

variable "business_unit_name" {
  description = "The name of the business unit"
}

Now you can set this variable to a different value each time you use the module:

module "business-unit-a" {
  source = "/terraform/modules/common-infra"
  business_unit_name = "a"
}

module "business-unit-b" {
  source = "/terraform/modules/common-infra"
  business_unit_name = "b"
}

module "business-unit-c" {
  source = "/terraform/modules/common-infra"
  business_unit_name = "c"
}

For more information, see How to create reusable infrastructure with Terraform modules and Terraform: Up & Running.

like image 121
Yevgeniy Brikman Avatar answered Sep 30 '22 20:09

Yevgeniy Brikman