Terraform: укажите конкретное имя сети Docker для вывода

У меня есть контейнерная сетевая функция (CNF), которая подключается к трем сетям Docker:

    ...
    ip_address        = "172.17.0.3"
    ip_prefix_length  = 16
    ipc_mode          = "private"
    log_driver        = "json-file"
    log_opts          = {}
    logs              = false
    max_retry_count   = 0
    memory            = 4096
    memory_swap       = -1
    must_run          = true
    name              = "c-router-52"
    network_data      = [
        {
            gateway          = "172.17.0.1"
            ip_address       = "172.17.0.3"
            ip_prefix_length = 16
            network_name     = "bridge"
        },
        {
            gateway          = "172.31.0.1"
            ip_address       = "172.31.0.4"
            ip_prefix_length = 16
            network_name     = "inside-net"
        },
        {
            gateway          = "172.30.0.1"
            ip_address       = "172.30.0.3"
            ip_prefix_length = 16
            network_name     = "outside-net"
        },
    ]
    network_mode      = "default"
    ...

И я пытаюсь получить IP-адрес "внешней сети" для использования в качестве входных данных для другого контейнера. Уточняю так:

${docker_container.c-router-52.network_data[2].ip_address}

Когда это третий элемент, он работает нормально.... Но проблема в том, что Terraform (или Docker, один из двух) не всегда ставит 'external-net' в качестве третьей сети:(

Есть ли способ указать [network_name="external-net"] вместо номера индекса?

1 ответ

Решение

Поскольку ваш пример кода не завершен, я должен немного догадаться, но похоже, что вам нужно сопоставление сетевого имени с IP-адресом. Вы можете получить такую ​​структуру данных из конфигурации вашего ресурса, используя forвыражение, которое можно присвоить локальному значению для использования в другом месте конфигурации:

locals {
  container_ip_addresses = {
    for net in docker_container.c-router-52.network_data :
    net.network_name => net.ip_address
  }
}

Используя приведенное выше определение в вашем модуле, вы можете обратиться к local.container_ip_addresses в другом месте вашего модуля для ссылки на это сопоставление, например local.container_ip_addresses["outside-net"] для доступа к outside-net адрес в частности.

С network_data структура, которую вы показали в своей конфигурации, local.container_ip_addresses будет иметь следующее значение:

{
  bridge      = "172.17.0.3"
  inside-net  = "172.31.0.4"
  outside-net = "172.30.0.3"
}

Если вам нужно получить доступ к другим атрибутам тех network_data объекты, а не просто ip_address, вы можете обобщить это, сделав значения сопоставления полными сетевыми объектами:

locals {
  container_networks = {
    for net in docker_container.c-router-52.network_data :
    net.network_name => net
  }
}

... что позволит вам получить доступ ко всем атрибутам через ключи сетевого имени:

local.container_networks["outside-net"].ip_address
local.container_networks["outside-net"].gateway
local.container_networks["outside-net"].ip_prefix_length
Другие вопросы по тегам