Terraform - Use loops aninhados com contagem

8

Estou tentando usar um loop aninhado no terraform. Eu tenho duas variáveis de lista list_of_allowed_accounts e list_of_images , e procurando iterar sobre a lista list_of_images e, em seguida, iterar na lista list_of_allowed_accounts .

Aqui está o meu código de 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}"
}

Este é um equivalente do que estou tentando fazer.

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
    
por vikas027 21.02.2017 / 00:14

2 respostas

18

O Terraform não tem suporte direto para esse tipo de iteração aninhada, mas podemos fingir com alguma aritmética.

variable "list_of_allowed_accounts" {
  type = "list"
  default = ["1111", "2222"]
}

variable "list_of_images" {
  type = "list"
  default = ["alpine", "java", "jenkins"]
}

data "template_file" "ecr_policy_allowed_accounts" {
  count = "${length(var.list_of_allowed_accounts) * length(var.list_of_images)}"

  template = "${file("${path.module}/ecr_policy.tpl")}"

  vars {
    account_id = "${var.list_of_allowed_accounts[count.index / length(var.list_of_images)]}"
    image      = "${var.list_of_images[count.index % length(var.list_of_images)]}"
  }
}

resource "aws_ecr_repository_policy" "repo_policy_allowed_accounts" {
  count = "${data.template_file.ecr_policy_allowed_accounts.count}"

  repository = "${var.list_of_images[count.index % length(var.list_of_images)]}"
  policy = "${data.template_file.ecr_policy_allowed_accounts.*.rendered[count.index]}"
}

Como queremos criar um modelo de política para cada combinação de conta e imagem, o count no bloco de dados template_file é os dois multiplicados juntos. Podemos então usar as operações de divisão e módulo para voltar de count.index para os índices separados em cada lista.

Como não possuía uma cópia do seu modelo de política, usei apenas um marcador de posição. essa configuração deu o seguinte plano:

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.0
    policy:     "policy allowing 1111 to access alpine"
    repository: "alpine"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.1
    policy:     "policy allowing 1111 to access java"
    repository: "java"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.2
    policy:     "policy allowing 1111 to access jenkins"
    repository: "jenkins"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.3
    policy:     "policy allowing 2222 to access alpine"
    repository: "alpine"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.4
    policy:     "policy allowing 2222 to access java"
    repository: "java"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.5
    policy:     "policy allowing 2222 to access jenkins"
    repository: "jenkins"

Cada instância da política se aplica a um par diferente de ID e imagem da conta, cobrindo todas as combinações.

    
por 03.04.2017 / 23:23
0

Basicamente, o problema está nos dados "template_file", o account_id não pode ser configurado da maneira que você pensa, já que a contagem no seu caso é apenas outra variável que nunca é incrementada / alterada. Só estou dizendo que sinto falta de ver exatamente qual é a sua pergunta.

    
por 12.03.2017 / 23:11