Terraform: дополнительные символы после окончания выражения ‘for’

#terraform

#terraform

Вопрос:

У меня есть файл данных site24x7IPs.json, он выглядит следующим образом:

 {
    "LocationDetails": [
        {
            "IPv6_Address_External": "2803:eb80:4000:d::0/64",
            "City": "Buenos Aires",
            "Place": "Argentina",
            "external_ip": "170.78.75.88"
        },
        {
            "IPv6_Address_External": "",
            "City": "Buenos Aires",
            "Place": "Argentina",
            "external_ip": "170.78.75.87"
        },
        {
            "IPv6_Address_External": "",
            "City": "Melbourne",
            "Place": "Australia",
            "external_ip": "103.91.166.0/24"
        },
        {
            "IPv6_Address_External": "2400:fa80:5:9:d68e:c0c1:fced:a31a",
            "City": "Perth",
            "Place": "Australia",
            "external_ip": "103.77.234.74"
        }
    ]
}
  

Ниже приведена часть моей terraform main.tf

 locals {
  site24x7IPs = jsondecode(file("${path.module}/site24x7IPs.json"))
}

locals {
  ipList = [for i in local.site24x7IPs.LocationDetails: i.external_ip if i.Place == "Australia"]
  cidrList = [ for j in local.ipList: length(regexall("/", j)) <= 0 : "${j}/32" : j ]
}
  

Мое ожидание:

cidrList = [ «103.91.166.0/24», «103.77.234.74/32» ]

Ошибка:

Ошибка: недопустимое выражение ‘for’

на main.tf строка 7, в locals: 7: cidrList = [ для j в local.IPList: длина(regexall(«/», j)) <= 0: «${j}/32»: j ]

Дополнительные символы после окончания выражения ‘for’.

Ответ №1:

Обновить:

Правильный синтаксис:

  cidrList = [ for j in local.ipList: 
              length(regexall("/", j)) <= 0 ? "${j}/32" : j ]
  

но вы используете double : вместо ? and ‘:’.

Предыдущий ответ

Не уверен, чего именно вы пытаетесь достичь, похоже, вам нужно что-то следующее:

  cidrList = [ for j in local.ipList: 
              {"${j}/32" : j } if length(regexall("/", j)) <= 0  ]
  

что дало бы:

 [
  {
    "103.77.234.74/32" = "103.77.234.74"
  },
]
  

или

  cidrList = [ for j in local.ipList: 
              "${j}/32" if length(regexall("/", j)) <= 0  ]
  

что дает:

 [
  "103.77.234.74/32",
]
  

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

1. Спасибо Марси. Я нашел много сообщений, в которых говорилось о поддержке цикла <условие> ? <истинное значение>: <ложное значение>, и я попробовал, как указано выше, но это так и не удалось. Моя версия terraform: Terraform v0.13.4

2. @user2920375 Я обновил ответ с правильным синтаксисом.