3 votes

Comment diviser les valeurs d'une carte dans Terraform pour créer des listes?

J'ai une variable de carte avec de nombreuses valeurs (règles NACL). J'essaie d'ajouter des règles en conséquence

variable "rules" {
  default = {
    a = "200,false,tcp,allow,0.0.0.0/0,23,23"
    b = "100,true,tcp,allow,0.0.0.0/0,1024,65535"
  }
}

resource "aws_network_acl_rule" "bar" {
  network_acl_id = ""
  rule_number    = "${split(",",element(values(var.rules),count.index))[0]}"
  egress         = "${split(",",element(values(var.rules),count.index))[1]}"
  protocol       = "${split(",",element(values(var.rules),count.index))[2]}"
  rule_action    = "${split(",",element(values(var.rules),count.index))[3]}"
  cidr_block     = "${split(",",element(values(var.rules),count.index))[4]}"
  from_port      = "${split(",",element(values(var.rules),count.index))[5]}"
  to_port        = "${split(",",element(values(var.rules),count.index))[6]}"
  count          = "${length(values(var.rules))}"
}

Erreur: "}" attendu mais "[" trouvé

Étant donné que les cartes avec des listes comme valeurs ne sont pas supportées, j'essaie de diviser les valeurs et d'itérer

12voto

AlexT Points 146

Une autre option, plus facile à lire, est avec lookup():

variable "rules" {
  default = [
    {
      rule_number = 200
      egress = false
      protocol = "tcp"
      rule_action = "allow"
      cidr_block = "0.0.0.0/0"
      from_port= 23
      to_port = 23
    },
    {
      rule_number = 100
      egress = true
      procotol = "tcp"
      rule_action = "allow"
      cidr_block = "0.0.0.0/0"
      from_port = 1024
      to_port = 65535
    },
  ]
}

resource "aws_network_acl_rule" "bar" {
  count          = "${length(var.rules)}"
  network_acl_id = ""
  rule_number    = "${lookup(var.rules[count.index], "rule_number")}"
  egress         = "${lookup(var.rules[count.index], "egress")}"
  protocol       = "${lookup(var.rules[count.index], "protocol")}"
  rule_action    = "${lookup(var.rules[count.index], "rule_action")}"
  cidr_block     = "${lookup(var.rules[count.index], "cidr_block")}"
  from_port      = "${lookup(var.rules[count.index], "from_port")}"
  to_port        = "${lookup(var.rules[count.index], "to_port")}"
}

5voto

BMW Points 4853

Voici une façon plus simple de traiter la carte rules

variable "rules" {
  default = {
   "0" = "200,false,tcp,allow,0.0.0.0/0,23,23"
   "1" = "100,true,tcp,allow,0.0.0.0/0,1024,65535"
  }
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_network_acl" "bar" {
  vpc_id = "${aws_vpc.main.id}"
}

resource "aws_network_acl_rule" "bar" {
  count          = "${length(var.rules)}"
  network_acl_id = "${aws_network_acl.bar.id}"
  rule_number    = "${element(split(",",var.rules[count.index]),0)}"
  egress         = "${element(split(",",var.rules[count.index]),1)}"
  protocol       = "${element(split(",",var.rules[count.index]),2)}"
  rule_action    = "${element(split(",",var.rules[count.index]),3)}"
  cidr_block     = "${element(split(",",var.rules[count.index]),4)}"
  from_port      = "${element(split(",",var.rules[count.index]),5)}"
  to_port        = "${element(split(",",var.rules[count.index]),6)}"
}

Si vous insistez pour utiliser l'ancienne carte, la clé est "a,b,...", vous devez ajuster la ressource à

variable "rules" {
  default = {
    "a" = "200,false,tcp,allow,0.0.0.0/0,23,23"
    "b" = "100,true,tcp,allow,0.0.0.0/0,1024,65535"
  }
}

resource "aws_network_acl_rule" "bar" {
  count          = "${length(var.rules)}"
  network_acl_id = "${aws_network_acl.bar.id}"
  rule_number    = "${element(split(",",element(values(var.rules),count.index)),0)}"
  egress         = "${element(split(",",element(values(var.rules),count.index)),1)}"
  protocol       = "${element(split(",",element(values(var.rules),count.index)),2)}"
  rule_action    = "${element(split(",",element(values(var.rules),count.index)),3)}"
  cidr_block     = "${element(split(",",element(values(var.rules),count.index)),4)}"
  from_port      = "${element(split(",",element(values(var.rules),count.index)),5)}"
  to_port        = "${element(split(",",element(values(var.rules),count.index)),6)}"
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X