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