Выходные значения
Выходные значения делают информацию о вашей инфраструктуре доступной в командной строке и могут предоставлять информацию для использования в других конфигурациях OpenTofu. Выходные значения похожи на возвращаемые значения в языках программирования.
Выходные значения используются в нескольких целях:
- Дочерний модуль может использовать выходные значения, чтобы предоставить родительскому модулю подмножество атрибутов своих ресурсов.
- Корневой модуль может использовать выходные значения для вывода определённых значений в интерфейсе командной строки после выполнения
tofu apply. - При использовании удалённого состояния выходные значения корневого модуля могут быть доступны другим конфигурациям через источник данных
terraform_remote_state.
Каждый управляемый OpenTofu экземпляр ресурса экспортирует атрибуты, значения которых можно использовать в других частях конфигурации. Выходные значения позволяют предоставить пользователю вашего модуля часть этой информации.
Для краткости выходные значения часто называют просто «выходами», если их значение ясно из контекста.
Объявление выходного значения
Каждое выходное значение, экспортируемое модулем, должно быть объявлено с помощью блока output:
output "instance_ip_addr" {
value = aws_instance.server.private_ip
}Метка сразу после ключевого слова output — это имя, которое должно быть допустимым идентификатором. В корневом модуле это имя отображается пользователю; в дочернем модуле с его помощью можно получить доступ к значению выхода.
Аргумент value принимает выражение, результат которого возвращается пользователю. В этом примере выражение ссылается на атрибут private_ip, предоставляемый ресурсом aws_instance, определённым в другом месте этого модуля (здесь он не показан). В качестве выходного значения можно использовать любое допустимое выражение.
Выходные значения отображаются только при применении плана OpenTofu. Выполнение tofu plan не приводит к отображению выходных значений.
Доступ к выходным значениям дочернего модуля
В родительском модуле выходные значения дочерних модулей доступны в выражениях как module.<MODULE NAME>.<OUTPUT NAME>. Например, если дочерний модуль с именем web_server объявил выходное значение с именем instance_ip_addr, к нему можно обратиться как к module.web_server.instance_ip_addr.
Пользовательские проверки условий
С помощью блоков precondition можно задавать гарантии для выходных данных. В следующих примерах создаётся предварительное условие, которое проверяет, зашифрован ли корневой том экземпляра EC2.
output "api_base_url" {
value = "https://${aws_instance.example.private_dns}:8433/"
# The EC2 instance must have an encrypted root volume.
precondition {
condition = data.aws_ebs_volume.example.encrypted
error_message = "The server's root volume is not encrypted."
}
}Пользовательские условия помогают зафиксировать предположения, чтобы будущим сопровождающим было проще понять замысел и структуру конфигурации. Они также позволяют раньше и в контексте получать полезные сведения об ошибках, помогая пользователям конфигураций проще диагностировать проблемы.
Подробнее см. в разделе Пользовательские проверки условий.
Необязательные аргументы
Блоки output могут дополнительно включать аргументы description, sensitive и depends_on, описанные в следующих разделах.
description — документация выходного значения
Поскольку выходные значения модуля являются частью его пользовательского интерфейса, вы можете кратко описать назначение каждого значения с помощью необязательного аргумента description:
output "instance_ip_addr" {
value = aws_instance.server.private_ip
description = "The private IP address of the main server instance."
}Описание должно кратко объяснять назначение выходного значения и указывать, какое значение ожидается. Эта строка описания может быть включена в документацию модуля, поэтому её следует формулировать с точки зрения пользователя модуля, а не его сопровождающего. Для пояснений сопровождающим модуля используйте комментарии.
sensitive — скрытие значений в выводе интерфейса командной строки
Выходное значение можно пометить как содержащее конфиденциальные данные с помощью необязательного аргумента sensitive:
output "db_password" {
value = aws_db_instance.db.password
description = "The password for logging in to the database."
sensitive = true
}OpenTofu скроет помеченные как конфиденциальные значения в сообщениях tofu plan и tofu apply. В следующем примере в корневом модуле объявлено конфиденциальное выходное значение, а также вызван модуль с конфиденциальным выходным значением, которое затем используется в атрибуте ресурса.
# main.tf
module "foo" {
source = "./mod"
}
resource "test_instance" "x" {
some_attribute = module.foo.a # resource attribute references a sensitive output
}
output "out" {
value = "xyz"
sensitive = true
}
# mod/main.tf, our module containing a sensitive output
output "a" {
value = "secret"
sensitive = true
}При выполнении плана или его применении конфиденциальное значение будет скрыто в выводе:
OpenTofu will perform the following actions:
# test_instance.x will be created
+ resource "test_instance" "x" {
+ some_attribute = (sensitive value)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ out = (sensitive value)OpenTofu по-прежнему будет записывать конфиденциальные значения в состояние, поэтому любой, кто имеет доступ к данным состояния, сможет получить конфиденциальные значения в открытом виде. Дополнительные сведения см. в разделе Конфиденциальные данные в состоянии.
depends_on — явные зависимости выходных значений
Поскольку выходные значения служат лишь для передачи данных из модуля, обычно нет необходимости учитывать их связи с другими узлами графа зависимостей.
Однако когда родительский модуль обращается к выходному значению, экспортируемому одним из его дочерних модулей, зависимости этого выходного значения позволяют OpenTofu правильно определять зависимости между ресурсами, заданными в разных модулях.
Как и в случае с зависимостями ресурсов, OpenTofu анализирует выражение value выходного значения и автоматически определяет набор зависимостей, но в редких случаях существуют зависимости, которые невозможно распознать неявно. В таких случаях аргумент depends_on можно использовать для задания дополнительных явных зависимостей:
output "instance_ip_addr" {
value = aws_instance.server.private_ip
description = "The private IP address of the main server instance."
depends_on = [
# Security group rule must be created before this IP address could
# actually be used, otherwise the services will be unreachable.
aws_security_group_rule.local_access,
]
}Аргумент depends_on следует использовать только в крайнем случае. При его использовании всегда добавляйте комментарий с объяснением причины, чтобы будущие сопровождающие понимали назначение дополнительной зависимости.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/values/outputs/