Spec-Zone.ru › OpenTofu 1.9

Что нового в OpenTofu 1.9?

На этой странице рассмотрены наиболее важные изменения в OpenTofu 1.9:

  • Новые возможности
    • Итерация провайдеров (for_each)
    • Флаг -exclude
  • Улучшения существующих возможностей
    • Улучшения раннего вычисления
    • Улучшения шифрования
    • Улучшения бэкенда
    • Улучшения CLI
    • Улучшения производительности
  • Устаревшие возможности
    • Использование ghcr.io/opentofu/opentofu в качестве базового образа
  • Исправления ошибок

Новые возможности​

Итерация провайдеров (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 и его предшественник, существуют некоторые ограничения, которые следует учитывать:

  1. Использовать for_each можно только для переменных и локальных значений, которые можно получить статически. Выражения, зависящие от источников данных или ресурсов, пока использовать нельзя.
  2. Если ваша инфраструктура уже развернута, не удаляйте провайдер из списка простым способом: это лишит OpenTofu возможности уничтожить инфраструктуру в этом регионе. Сначала необходимо удалить эту инфраструктуру и только после этого убрать провайдер из списка. Пример приведен выше для переменной disabled_regions. OpenTofu попытается предупредить вас, если вы не используете отдельные переменные для итераций по провайдерам и ресурсам. Мы настоятельно рекомендуем прислушаться к этому предупреждению.
  3. В этой версии каждый провайдер, используемый в for_each, должен иметь псевдоним. По внутренним техническим причинам провайдеры без псевдонимов пока не поддерживаются.
  4. Передать набор провайдеров модулю пока нельзя — можно передавать только отдельные провайдеры.

Подробную информацию см. в полной документации.

Флаг -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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API