#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, на которую вы мне указали 🙂