Что нового в OpenTofu 1.9?
На этой странице рассмотрены наиболее важные изменения в OpenTofu 1.9:
Новые возможности
Итерация провайдеров (for_each)
Одна из главных сложностей при поддержании чистоты кода в развертывании с несколькими регионами или зонами — огромное количество провайдеров и связанных с ними конфигураций, которыми приходится управлять. По сути, для каждого региона или зоны необходимо создавать дублирующийся код.
Благодаря итерации провайдеров теперь можно избавиться от дублирования кода, перебирая набор провайдеров вместо использования дублирующегося кода. Если у вас небольшая конфигурация с одним из облачных провайдеров, предлагающих несколько зон, начните с добавления двух переменных:
variable "regions" {
description = "A list of regions that should have a deployment."
type = set(string)
}
variable "disabled_regions" {
description = "A list of regions that should be disabled and all resources removed."
type = set(string)
default = []
}Переменная regions содержит список регионов, в которых вы хотите выполнить развертывание. Переменная disabled_regions позволяет позже исключить регион, не удаляя провайдер. Эта возможность чрезвычайно важна, поскольку если удалить провайдер, не удалив его ресурсы, OpenTofu не сможет удалить ресурсы в этом регионе.
Затем можно объявить провайдеры. Как видите, для этого достаточно одного объявления. Единственное ограничение, о котором стоит упомянуть, — alias. Из-за технических ограничений в этой версии for_each можно использовать только вместе с alias.
provider "aws" {
alias = "by_region"
region = each.value
for_each = var.regions
}Наконец, можно использовать набор провайдеров для вызова подмодуля. Обратите внимание: в отличие от расположенного выше блока provider, for_each выполняет итерацию только по включенным провайдерам. Это позволяет правильно вывести регион из эксплуатации, а затем полностью удалить провайдер.
module "deploy" {
source = "./deploy"
providers = {
aws = aws.by_region[each.key]
}
for_each = setsubtract(var.regions, var.disabled_regions)
}Поскольку эта возможность существенно отличается от того, как работали OpenTofu и его предшественник, существуют некоторые ограничения, которые следует учитывать:
- Использовать
for_eachможно только для переменных и локальных значений, которые можно получить статически. Выражения, зависящие от источников данных или ресурсов, пока использовать нельзя. - Если ваша инфраструктура уже развернута, не удаляйте провайдер из списка простым способом: это лишит OpenTofu возможности уничтожить инфраструктуру в этом регионе. Сначала необходимо удалить эту инфраструктуру и только после этого убрать провайдер из списка. Пример приведен выше для переменной
disabled_regions. OpenTofu попытается предупредить вас, если вы не используете отдельные переменные для итераций по провайдерам и ресурсам. Мы настоятельно рекомендуем прислушаться к этому предупреждению. - В этой версии каждый провайдер, используемый в
for_each, должен иметь псевдоним. По внутренним техническим причинам провайдеры без псевдонимов пока не поддерживаются. - Передать набор провайдеров модулю пока нельзя — можно передавать только отдельные провайдеры.
Подробную информацию см. в полной документации.
Флаг -exclude
В OpenTofu уже есть параметр -target, позволяющий планировать или применять изменения только для определенных ресурсов. А что, если применить изменения ко всему, кроме определенного ресурса? Именно эта идея лежит в основе флага -exclude. Фактически, это был один из самых популярных запросов на добавление возможностей в этом выпуске.
Проверить его можно, создав следующую простую конфигурацию:
resource "local_file" "a" {
filename = "a.txt"
content = "a"
}
resource "local_file" "b" {
filename = "b.txt"
content = "b"
}
resource "local_file" "c" {
filename = "c.txt"
content = "c"
}Если выполнить tofu apply -exclude local_file.b, вы увидите, что OpenTofu создает a.txt и c.txt, но не b.txt.
Улучшения существующих возможностей
Улучшения раннего вычисления
При использовании раннего вычисления, появившегося в OpenTofu 1.8, OpenTofu теперь запрашивает переменные, необходимые для вычисления.
Улучшения шифрования
Новый параметр encrypted_metadata_alias для шифрования состояния
Одна из сложностей при использовании шифрования состояния в предыдущих версиях заключалась в том, что OpenTofu должен сохранять имя поставщика ключей в зашифрованных данных вместе с метаданными, необходимыми для расшифровки. Поэтому при изменении имени поставщика ключей требовалось использовать блок fallback, а имена поставщиков ключей для источников данных удаленного состояния должны были совпадать. В OpenTofu 1.9 появился новый параметр encrypted_metadata_alias, который позволяет явно указать идентификатор, сохраняемый вместе с зашифрованными данными:
terraform {
encryption {
key_provider "pbkdf2" "mykey" {
passphrase = "OpenTofu has encryption"
# Note the fixed encrypted_metadata_alias here:
encrypted_metadata_alias = "certificates"
}
method "aes_gcm" "mymethod" {
keys = key_provider.pbkdf2.mykey
}
state {
method = method.aes_gcm.mymethod
}
}
}Автоматическое применение шифрования
В предыдущей версии OpenTofu изменение конфигурации шифрования не приводило к применению шифрования, если изменения ресурсов не обнаруживались. В новой версии OpenTofu применяет конфигурацию шифрования, даже если план не содержит изменений ресурсов.
Улучшения тестирования и проверки
-
tofu testтеперь выдает ошибки, а не предупреждения, при обнаружении недопустимых полей переопределения и имитации. -
tofu testтеперь поддерживает блокиoverride_resourceиoverride_dataв области действия одногоmock_provider. - Ссылки на переменные, данные и т. д. теперь можно использовать в проверке переменных.
- Теперь для объединения похожих предупреждений и ошибок можно использовать параметры
-consolidate-warningsи-consolidate-errors.
Улучшения бэкенда
- Бэкенд HTTP теперь поддерживает расширенное ведение журнала трассировки, включая тела запросов и ответов.
- Бэкенд
AzureRMтеперь поддерживает параметрtimeout_seconds; значение времени ожидания по умолчанию составляет 300 секунд.
Улучшения CLI
-
tofu consoleтеперь принимает выражения, разбитые на несколько строк, если символы новой строки стоят внутри парных скобок или экранированы обратной косой чертой. -
Параметр
-show-sensitiveзаставляет командыtofu plan,tofu applyи другие команды, которые могут возвращать данные из конфигурации или состояния, показывать конфиденциальные значения.
Улучшения производительности
При поддержке сообщества мы внесли ряд улучшений производительности для больших графов и большого количества подмодулей.
Устаревшие возможности
Использование ghcr.io/opentofu/opentofu в качестве базового образа
Использование образа ghcr.io/opentofu/opentofu в качестве базового для пользовательских образов считается устаревшим и будет удалено в OpenTofu 1.10. Причина этого изменения — безопасность: мы регулярно обновляем сам OpenTofu при появлении важных с точки зрения безопасности обновлений, но для поддержки базового образа его пришлось бы обновлять примерно раз в неделю, а сейчас у нас нет возможности делать это.
Однако в инструкции по установке в контейнере мы добавили рекомендации по созданию собственного базового образа.
Исправления ошибок
-
templatefileбольше не аварийно завершает работу, если указанное имя файла получено из конфиденциального значения. (#1801) - Загрузка конфигурации больше не приводит к аварийному завершению работы, если в блоке
moduleотсутствует обязательный аргументsource. (#1888) - Команда
tofu force-unlockтеперь возвращает подходящую ошибку при использовании с бэкендом, не настроенным для поддержки блокировок. (#1977) - Создание конфигурации при импорте больше не приводит к аварийному завершению работы, если импортируемый объект содержит конфиденциальные значения. (#1986, #2077)
-
Файлы
.tfvarsиз каталогаtestsбольше не загружаются ошибочно при выполнении команд, не связанных с тестированием. (#2039) -
Интерактивный режим
tofu consoleтеперь правильно обрабатывает специальную командуexit. (#2086) - Функции, предоставляемые провайдерами, теперь корректно вызываются при использовании в блоке
validationобъявления входной переменной. (#2052) - Конфиденциальные значения теперь запрещены при раннем вычислении конфигурации бэкенда и расположений исходного кода модулей, поскольку в противном случае они могли бы раскрыться при инициализации бэкенда или установке модуля. (#2045)
-
tofu providers mirrorбольше не аварийно завершает работу, если в файле блокировки зависимостей отсутствуют или недействительны записи. (#1985) - Теперь OpenTofu учитывает запросы функций, предоставляемых провайдерами, вызывать их только тогда, когда все их аргументы известны. Это обеспечивает совместимость с функциями, которые не могут самостоятельно обрабатывать неизвестные значения. (#2127)
-
tofu initбольше не дублирует диагностические сообщения, создаваемые при вычислении выражений раннего вычисления. (#1890) -
Описание изменений
tofu planтеперь содержит сведения о блоках конфигурации, созданных с помощью блокаdynamicс неизвестным значениемfor_each. (#1948) - Сообщение об ошибке несоответствия типа провайдера теперь правильно указывает, в каком модуле возникла проблема. (#1991)
- Теперь функция
yamldecodeинтерпретирует скалярные значения как числа в соответствии со спецификацией YAML 1.2. В частности, скалярное значение+теперь интерпретируется как строка"+", а не приводит к ошибке разбора при попытке интерпретировать его как целое число. (#2044) - Аргумент
versionблокаmoduleтеперь принимает выбор предварительных версий с префиксом "v" перед номером версии. Ранее это допускалось только для выбора обычных версий. ([#2124])(https://github.com/opentofu/opentofu/issues/2124) - Команда
tofu testбольше не пытается проверять определение имитации провайдера по схеме соответствующего провайдера. (#2140) - Проверка типов для имитаций и переопределений в
tofu testстала менее строгой. (#2144) - Пропускать логику блоков imports в
tofu destroy(#2214) - Обновлена версия github.com/golang-jwt/jwt/v4: с 4.4.2 до 4.5.1, чтобы удовлетворить требованиям сканеров безопасности (уязвимостей нет, см. #2179)
-
tofu testтеперь задаетnullдля динамического типа при создании имитируемых значений. (#2245) - Для переменных, объявленных в тестовых файлах, теперь учитываются значения типа по умолчанию. (#2244)
-
tofu testтеперь удаляет выходные значения уничтоженных модулей между разными запусками тестов. (#2274) - Изменения в
create_before_destroyдля ресурсов, требующих замены, теперь корректно обрабатываются при отключенном обновлении состояния. (#2248) -
Команда
tofu initне пытается читать ключи шифрования, если установлен флаг-backend=false. (https://github.com/opentofu/opentofu/pull/2293)
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/intro/whats-new/