J'essaie d'utiliser une boucle imbriquée dans terraform. J'ai deux variables de liste list_of_allowed_accounts
et list_of_images
, et je cherche à parcourir la liste list_of_images
puis à parcourir la liste list_of_allowed_accounts
.
Voici mon code terraform.
variable "list_of_allowed_accounts" {
type = "list"
default = ["111111111", "2222222"]
}
variable "list_of_images" {
type = "list"
default = ["alpine", "java", "jenkins"]
}
data "template_file" "ecr_policy_allowed_accounts" {
template = "${file("${path.module}/ecr_policy.tpl")}"
vars {
count = "${length(var.list_of_allowed_accounts)}"
account_id = "${element(var.list_of_allowed_accounts, count.index)}"
}
}
resource "aws_ecr_repository_policy" "repo_policy_allowed_accounts" {
count = "${length(var.list_of_images)}"
repository = "${element(aws_ecr_repository.images.*.id, count.index)}"
count = "${length(var.list_of_allowed_accounts)}"
policy = "${data.template_file.ecr_policy_allowed_accounts.rendered}"
}
Ceci est un équivalent bash de ce que j'essaie de faire.
for image in alpine java jenkins
do
for account_id in 111111111 2222222
do
// call template here using variable 'account_id' and 'image'
done
done
account_id = var.list_of_allowed_accounts[floor(count.index / length(var.list_of_images))]
Les réponses ici fonctionnent (je les ai utilisées initialement), mais je pense que j'ai une meilleure solution en utilisant la fonction setproduct de Terraform . Je n'en ai pas vu beaucoup d'exemples utilisés autour des interwebs, mais setproduct prend deux ensembles (ou plus important encore, deux listes) et produit une liste d'ensembles avec chaque permutation des entrées. Dans mon cas, je crée des paramètres SSM:
Cela crée des paramètres SSM nommés:
Mon petit cerveau wimpy peut analyser cela un peu plus facilement que la magie modulo dans les autres réponses!
la source
${length(var.list1) * length(var.list2)}
au lieu de${length(local.product)}
compter?${length(local.product)}
fait probablement plus depuis. De plus, je suis assez certain qu'ilsetproduct()
existe avant la 0.12, (le message en haut de la page liée n'est qu'un avertissement générique pour tous leurs documents 0.11, je pense?)Pour info si quelqu'un vient ici de Google, si vous utilisez terraform 0.12, vous devrez utiliser la fonction de plancher partout où vous divisez, sinon vous obtiendrez une erreur sur les index partiels.
la source
for
,for_each
et / ou des constructions de langage de blocs imbriqués dynamiques pour mettre en œuvre quelque chose d' un peu moins confus?Fondamentalement, le problème réside dans les données "template_file", le account_id ne peut pas être défini comme vous le pensez, car le nombre dans votre cas est juste une autre variable qui n'est jamais incrémentée / modifiée. Je dis juste que je manque de voir quelle est votre question exactement.
la source
Je n'ai pas assez de points de réputation pour ajouter un commentaire à la réponse fournie par @ Martin Atkins , donc je poste sa réponse avec une légère modification, qui contourne le problème Terraform 20567
la source