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

#terraform #terraform-provider-docker

#terraform #terraform-provider-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, один из двух) не всегда помещает «внешнюю сеть» в качестве третьей сети: (

Есть ли способ указать [network_name=»outside-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
  

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

1. Спасибо за подробный ответ! Лучше, чем фактическая страница документа Terraform, на которую вы мне указали 🙂