web-dev-qa-db-fra.com

Clés variables dans les cartes terraform

Dans Terraform, j'essaie de créer un module avec une carte avec des clés variables. Je ne sais pas si cela est possible, mais j’ai essayé sans succès ce qui suit.

resource "aws_instance" "web" {
    AMI = "${var.base_AMI}"
    availability_zone = "${var.region_a}"
    instance_type = "${var.ec2_instance_size}"
    security_groups = ["sec1"]
    count = "${var.ec2_instance_count}"
    tags {
        Name = "${var.role} ${var_env}"
        role = "${var.app_role}"
        ${var.app_role} = "${var_env}"
    }
}

et ça:

tags {
   Name = "${var.role} ${var_env}"
}
tags."${var.role}" = "${var.env}"

Des idées? N'est-ce pas possible avec Terraform actuellement?

7
JoeyP

Je sais que cela fait un certain temps que vous avez posté, mais j'avais récemment besoin de quelque chose de similaire, alors je poste la solution ici, au cas où quelqu'un d'autre tomberait dessus. 

Il existe (maintenant) une fonction lookup prise en charge dans la syntaxe d'interpolation terraform, qui vous permet de rechercher des clés dynamiques dans une carte. 

En utilisant cela, je peux maintenant faire des choses comme:

output "image_bucket_name" {
  value = "${lookup(var.image_bucket_names, var.environment, "No way this should happen")}"
}

où:

variable "image_bucket_names" {
  type = "map"

  default = {
    development = "bucket-dev"
    staging = "bucket-for-staging"
    preprod = "bucket-name-for-preprod"
    production = "bucket-for-production"
  }

}

et environment est une variable chaîne simple. 

15
gsaslis

J'ai récemment eu besoin de définir dynamiquement une clé de balise, et j'ai réussi à le faire en utilisant zipmap:

locals {
  ec2_tag_keys = ["some/prefix/${var.some_var}", "another_tag"]
  ec2_tag_vals = ["some value", "another value"]
}

resource "aws_instance", "foo" {
  ...
  tags = "${zipmap(local.ec2_tag_keys, local.ec2_tag_vals)}"
}

C'est un peu maladroit, mais ça marche.

3
scottatron

Ce qui suit fonctionne avec terraform version 0.11.7. Cette solution utilise la fonction map .

resource "aws_instance" "web" {
  ...
  tags = "${map(
    "Name", "${var.role} ${var_env}",
    "role", "${var.app_role}",
    "${var.app_role}", "${var_env}"
  )}"
}
3
lander2k2

Je ne sais pas quand il a été ajouté, mais au moins à compter de la version 0.11.7, Terraform prend en charge l'utilisation de variables comme clés de carte. Voici un exemple d'utilisation de ce dernier pour sélectionner le type d'instance AWS:

Dans le fichier .tf:

variable "environment" {}

...

variable "instance_types_webserver" {
  type = "map"

  default = {
    testing    = "t2.small"
    qa         = "t2.medium"
    staging    = "t2.xlarge"
    production = "t2.xlarge"
  }
}

...

resource "aws_opsworks_instance" "verification" {
  stack_id      = "${aws_opsworks_stack.verification.id}"
  layer_ids     = ["${aws_opsworks_custom_layer.verification.id}"]
  instance_type = "${var.instance_types_webserver["${var.environment}"]}"
  state         = "running"
  count         = 1
}

Dans le fichier .tfvars:

...
environment = "testing"
...
1
Matt Lewin

Cette fonctionnalité n'est pas encore prise en charge. 

1
padmakarojha