Проверки
Блок check может проверять вашу инфраструктуру за пределами обычного жизненного цикла ресурсов. Блоки check устраняют пробел между этапом после применения конфигурации и функциональной проверкой инфраструктуры.
Блоки check позволяют определять пользовательские условия, которые выполняются при каждой операции планирования или применения OpenTofu, не влияя на общий статус операции. Блоки check выполняются на последнем этапе планирования или применения, после того как OpenTofu спланировал или подготовил вашу инфраструктуру.
Синтаксис
Вы можете объявить блок check с локальным именем, от нуля до одного источника данных с ограниченной областью видимости и одним или несколькими утверждениями.
В следующем примере загружается веб-сайт и проверяется, что он возвращает ожидаемый код состояния 200.
check "health_check" {
data "http" "opentofu_org" {
url = "https://www.opentofu.org"
}
assert {
condition = data.http.opentofu_org.status_code == 200
error_message = "${data.http.opentofu_org.url} returned an unhealthy status code"
}
}Источники данных с ограниченной областью видимости
В качестве источника данных с ограниченной областью видимости внутри блока check можно использовать любой источник данных любого провайдера.
Блок check может содержать вложенный источник данных (то есть источник данных с ограниченной областью видимости). Этот блок data ведет себя как внешний источник данных, за исключением того, что на него нельзя ссылаться за пределами содержащего его блока check. Кроме того, если провайдер источника данных с ограниченной областью видимости выдает ошибки, они маскируются как предупреждения и не мешают OpenTofu продолжить выполнение операции.
Источник данных с ограниченной областью видимости можно использовать для проверки состояния части инфраструктуры вне обычного жизненного цикла ресурсов OpenTofu. В приведенном выше примере, если не удается загрузить источник данных opentofu_org, вы получите предупреждение вместо блокирующей ошибки, которая возникла бы, если бы вы объявили этот источник данных за пределами блока check.
Метааргументы
Источники данных с ограниченной областью видимости поддерживают метааргументы depends_on и provider . Метааргументы. Источники данных с ограниченной областью видимости не поддерживают метааргументы count илиfor_each.
depends_on
Метааргумент depends_on может быть особенно полезен при использовании в источниках данных с ограниченной областью видимости.
При первом создании OpenTofu начального плана для предыдущего примера план завершается с ошибкой, поскольку OpenTofu еще не применил конфигурацию. Это означает, что проверка завершается с ошибкой, потому что OpenTofu еще должен создать ресурсы, необходимые для работы веб-сайта. Поэтому при первом запуске этой проверки OpenTofu всегда выдает потенциально отвлекающее сообщение об ошибке.
Это можно исправить, добавив depends_on к источнику данных с ограниченной областью видимости, чтобы задать зависимость от важной части инфраструктуры сайта, например балансировщика нагрузки. Проверка возвращает known after apply, пока эта важная часть веб-сайта не будет готова. Такой подход помогает избежать ненужных предупреждений во время настройки, а проверка выполняется при последующих операциях планирования и применения.
Недостаток этого подхода заключается в том, что если ресурс, от которого зависит источник данных с ограниченной областью видимости depends_on, изменится, блок check будет возвращать known after apply, пока OpenTofu не обновит этот ресурс. В зависимости от вашего случая такое поведение может быть приемлемым или проблематичным.
Мы рекомендуем реализовать метааргумент depends_on, если источник данных с ограниченной областью видимости зависит от существования другого ресурса, но не ссылается на него напрямую.
Утверждения
Блоки check проверяют пользовательские утверждения с помощью блоков assert. Каждый блок check должен содержать как минимум один блок assert, но может содержать и несколько таких блоков. Каждый блок assert имеет атрибут condition и атрибут error_message.
В отличие от других пользовательских условий, утверждения не влияют на выполнение OpenTofu. При невыполнении утверждения выдается предупреждение, но текущая операция не прерывается. Это отличается от других пользовательских условий, например постусловия, при невыполнении которого OpenTofu немедленно выдает ошибку, останавливая операцию и блокируя применение конфигурации или планирование будущих ресурсов.
Аргументы условий внутри блоков assert могут ссылаться на источники данных с ограниченной областью видимости внутри содержащего их блока check, а также на любые переменные, ресурсы, источники данных или выходные значения модулей в текущем модуле.
Метааргументы
В настоящее время блоки check не поддерживают метааргументы. Мы продолжаем собирать отзывы об этой функции, поэтому, если в вашем случае блокам check пригодилась бы поддержка метааргументов, пожалуйста, сообщите нам.
Непрерывная проверка в TACOS (ПО для автоматизации и совместной работы с TF)
TACOS (ПО для автоматизации и совместной работы с TF) может автоматически проверять, продолжают ли выполняться проверки в конфигурации рабочего пространства после того, как OpenTofu подготовит новую инфраструктуру.
Выбор блоков check или других пользовательских условий
Блоки check предлагают наиболее гибкий способ проверки в OpenTofu. В утверждениях блока check можно ссылаться на выходные значения, переменные, ресурсы и источники данных. Кроме того, с помощью проверок можно моделировать любые другие пользовательские условия. Однако это не значит, что следует заменять все пользовательские условия блоками check.
Утверждения в блоках check и другие пользовательские условия существенно различаются по поведению. Главное отличие заключается в том, что блоки check не влияют на выполнение операций OpenTofu. Вы можете учитывать это неблокирующее поведение при выборе наиболее подходящего типа проверки для вашего случая.
Выходные значения и переменные
Постусловия выходных значений и проверки переменных позволяют задавать утверждения для входных и выходных данных.
В некоторых случаях может потребоваться, чтобы OpenTofu блокировал дальнейшее выполнение.
Например, OpenTofu не должен предупреждать о недопустимой входной переменной после применения всей конфигурации с этой переменной. В этом случае блок check предупредит о недопустимой входной переменной, не прерывая операцию. Блок проверки для той же входной переменной сообщит о недопустимом значении и остановит операцию планирования или применения.
Предусловия и постусловия ресурсов
Различие между предусловиями и постусловиями и блоками check не так однозначно.
Предусловия отличаются от других пользовательских условий тем, что выполняются до применения или планирования изменения ресурса. В разделе «Выбор между предусловиями и постусловиями» приводятся рекомендации по выбору между предусловием и постусловием; те же соображения применимы и при выборе между предусловием и блоком check.
Постусловия часто можно использовать вместо блоков check для проверки ресурсов и источников данных.
Например, можно переписать приведенный выше пример блока check, используя вместо него постусловие. В приведенном ниже коде блок postcondition проверяет, что веб-сайт возвращает ожидаемый код состояния 200.
data "http" "opentofu_org" {
url = "https://www.opentofu.org"
lifecycle {
postcondition {
condition = self.status_code == 200
error_message = "${self.url} returned an unhealthy status code"
}
}
}Примеры с блоками check и postcondition проверяют, что веб-сайт возвращает код состояния 200 во время операции планирования или применения. Эти блоки отличаются тем, как они обрабатывают сбой.
Если блок postcondition завершается с ошибкой, он блокирует выполнение текущей операции OpenTofu. Если блок check завершается с ошибкой, он не блокирует выполнение операции OpenTofu.
Если постусловие в приведенном выше примере не выполняется, восстановиться невозможно. OpenTofu блокирует любые будущие операции планирования или применения, если постусловие не выполнено на этапе планирования. Это происходит потому, что постусловие зависит не напрямую от конфигурации OpenTofu, а от сложного взаимодействия нескольких ресурсов.
Мы рекомендуем использовать блоки check для проверки состояния инфраструктуры в целом. Постусловия мы рекомендуем использовать только в тех случаях, когда вам нужна гарантия для отдельного ресурса, основанная на его конфигурации.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/checks/