Сплат-выражения
Сплат-выражение позволяет более лаконично записать распространённую операцию, которую иначе можно было бы выполнить с помощью выражения for.
Если var.list — это список объектов, у каждого из которых есть атрибут id, то список идентификаторов можно получить с помощью следующего выражения for:
[for o in var.list : o.id]
Это эквивалентно следующему сплат-выражению:
var.list[*].id
Специальный символ [*] перебирает все элементы списка, указанного слева от него, и получает из каждого элемента атрибут, имя которого указано справа. Сплат-выражение также можно использовать для доступа к атрибутам и индексам элементов списка сложных типов, добавляя последовательность операций справа от символа:
var.list[*].interfaces[0].name
Приведённое выше выражение эквивалентно следующему выражению for:
[for o in var.list : o.interfaces[0].name]
Сплат-выражения с картами
Описанные выше шаблоны сплат-выражений применимы только к спискам, множествам и кортежам. Чтобы получить аналогичный результат с картой или значением объекта, необходимо использовать выражения for.
Ресурсы, в которых используется аргумент for_each, представлены в выражениях в виде карты объектов, поэтому сплат-выражения с такими ресурсами использовать нельзя. Дополнительные сведения см. в разделе Ссылки на экземпляры ресурсов.
Одиночные значения как списки
Сплат-выражения ведут себя особым образом, если применить их к значению, которое не является списком, множеством или кортежем.
Если значение не равно null, сплат-выражение преобразует его в список из одного элемента или, точнее, в кортеж из одного элемента. Если значение равно null, сплат-выражение возвращает пустой кортеж.
Это особое поведение может быть полезно для модулей, принимающих необязательные входные переменные, значение по умолчанию которых равно null и обозначает отсутствие значения. Благодаря этому модуль может адаптировать значение переменной для использования в возможностях языка OpenTofu, предназначенных для работы с коллекциями. Например:
variable "website_setting" {
type = object({
index_document = string
error_document = string
})
default = null
}
resource "aws_s3_bucket" "example" {
# ...
dynamic "website" {
for_each = var.website_setting[*]
content {
index_document = website.value.index_document
error_document = website.value.error_document
}
}
}В приведённом выше примере используется блок dynamic, который создаёт ноль или несколько вложенных блоков на основе значения-коллекции. Входная переменная var.website_setting определена как одиночный объект, который может иметь значение null. Поэтому в выражении for_each блока dynamic используется [*], чтобы гарантировать создание одного блока, если вызывающий модуль задаёт аргумент website, или нуля блоков, если аргумент остаётся равным null.
Это особое поведение сплат-выражений может быть неочевидным для незнакомого с ним читателя, поэтому мы рекомендуем использовать его только в аргументах for_each и аналогичных случаях, когда контекст подразумевает работу с коллекцией. В противном случае смысл выражения может быть неясен тем, кто будет читать конфигурацию в будущем.
Устаревшие сплат-выражения (только с атрибутами)
В ранних версиях языка OpenTofu использовался немного иной вариант сплат-выражений, поддержку которого OpenTofu сохраняет для обратной совместимости. Этот старый вариант менее полезен, чем описанная выше современная форма, поэтому мы не рекомендуем использовать его в новых конфигурациях.
В устаревших сплат-выражениях «только с атрибутами» используется последовательность .* вместо [*]:
var.list.*.interfaces[0].name
Эта форма имеет едва заметное отличие в поведении и эквивалентна следующему выражению for:
[for o in var.list : o.interfaces][0].name
Обратите внимание: в сплат-выражении только с атрибутами операция индексирования [0] применяется к результату перебора, а не выполняется в ходе самого перебора. Для каждого элемента входных данных выполняется только поиск атрибутов. Это ограничение вызывало затруднения у некоторых пользователей ранних версий OpenTofu, поэтому мы рекомендуем всегда использовать сплат-выражения нового типа с [*], чтобы поведение было более последовательным.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.11/language/expressions/splat/