Вложенные циклы в Terraform

#terraform

#terraform

Вопрос:

Мне нужна логика вложенного цикла. например.

У меня есть один локальный:

 locals {
  build_args = {
    api: {
      RAILS_ENV: "production"
    }
    client: {
      NODE_ENV: "production"
    }
  }
}
  

Теперь я хотел бы подключиться к CircleCI с помощью terraform и установить эти среды в соответствующих проектах CircleCI (api и client). Информация о проектах circleci (название проекта) Я продолжаю здесь:

 apps: {
  api: {
    desired_count: 1,
    load_balancer: {
      container_name: "api",
      container_port: 5000,
      health_check_path: "/",
      listener: {
        path: "api",
      },
    },
    circleci_project: "some-api",
  },
  client: {
    desired_count: 1,
    load_balancer: {
      container_name: "client",
      container_port: 3000,
      health_check_path: "/",
      listener: {
        path: "web",
      },
    },
    circleci_project: "some-client",
  }
}
  

Теперь мне нужно создать ресурс:

 resource "circleci_environment_variable" "this" {
  project = projects_from_apps_var

  name = names_from_local_build_args
  value = value_from_local_build_args
}
  

Итак, как вы можете видеть, мне нужны два цикла один в другом, чтобы генерировать множество пар имя / значения env для многих проектов.

Комментарии:

1. Согласно вашему вопросу, у вас будет только один цикл, повторяющийся по списку api, client . Где возникнет второй цикл?

2. Внутри API и клиента мне нужно перебирать envs, так что это второй цикл

3. Вероятно, вы захотите объединить две карты в матрицу 2×2, а затем выполнить итерацию по ней как преобразованную 1×4.

4. Есть примеры такого подхода?

Ответ №1:

Просто создайте карту с ключом по имени проекта и переменной и примените кучу ресурсов для каждой комбинации:

 locals {
  map = merge([
    for project, env in local.build_args : {
      for name, value in env : "${project}-${name}" => {
        name    = name,
        value   = value,
        project = project
      }
    }
  ]...)
}

resource "circleci_environment_variable" "this" {
  for_each = local.map

  project = each.value.project
  name    = each.value.name
  value   = each.value.value
}
  

Комментарии:

1. ОБРАТИТЕ внимание, что многоточие является обязательной частью примера (а не просто псевдокодом «и так далее»). Это аргумент расширяющейся функции для Terraform.