Spec-Zone.ru › OpenTofu 1.10

Адресация ресурсов

Адрес ресурса — это строка, идентифицирующая ноль или более экземпляров ресурсов в вашей конфигурации.

Адрес состоит из двух частей:

Блок кода
[module path][resource spec]

В некоторых контекстах OpenTofu может допускать неполный адрес ресурса, который указывает только на модуль целиком или не содержит индекс ресурса с несколькими экземплярами. В таких случаях значение зависит от контекста, поэтому вам потребуется обратиться к документации по используемой функции, которая разбирает адреса ресурсов.

Путь модуля​

Путь модуля указывает на модуль в дереве модулей. Он имеет следующий вид:

Блок кода
module.module_name[module index]
  • module — ключевое слово модуля, указывающее на дочерний модуль (не корневой). Несколько ключевых слов module в пути указывают на вложенность.
  • module_name — имя модуля, заданное пользователем.
  • [module index] — (необязательно) Индекс для выбора экземпляра из вызова модуля с несколькими экземплярами; заключается в квадратные скобки ([ и ]).

Адрес без спецификации ресурса, то есть module.foo, применяется ко всем ресурсам в модуле, если у модуля один экземпляр, или ко всем экземплярам модуля, если их несколько. Чтобы указать все ресурсы конкретного экземпляра модуля, включите индекс модуля в адрес, например module.foo[0].

Если путь модуля опущен, адрес применяется к корневому модулю.

Пример использования ключевого слова module для разделения двух модулей с несколькими экземплярами:

Блок кода
module.foo[0].module.bar["a"]

Спецификация ресурса​

Спецификация ресурса указывает на конкретный экземпляр ресурса в выбранном модуле. Она имеет следующий синтаксис:

Блок кода
resource_type.resource_name[instance index]
  • resource_type — тип ресурса, на который указывается.
  • resource_name — имя ресурса, заданное пользователем.
  • [instance index] — (необязательно) Индекс для выбора экземпляра ресурса с несколькими экземплярами; заключается в квадратные скобки ([ и ]).

Спецификация ресурса без префикса пути модуля соответствует только ресурсам корневого модуля.

Значения индексов для модулей и ресурсов​

К значениям индексов модулей и ресурсов с несколькими экземплярами применяются следующие правила:

  • [N], где N — числовой индекс с нумерацией с 0 для ресурса с несколькими экземплярами, заданными с помощью метааргумента count. Если при указании ресурса с count > 1 индекс опущен, адрес ссылается на все экземпляры.
  • ["INDEX"], где INDEX — буквенно-цифровой ключевой индекс для ресурса с несколькими экземплярами, заданными с помощью метааргумента for_each.

Примеры​

Пример count​

Предположим, что конфигурация OpenTofu содержит:

Блок кода
resource "aws_instance" "web" {
  # ...
  count = 4
}

Адрес вида:

Блок кода
aws_instance.web[3]

указывает только на последний экземпляр в конфигурации, а адрес вида:

Блок кода
aws_instance.web

указывает на все четыре экземпляра «web».

Пример for_each​

Предположим, что конфигурация OpenTofu содержит:

Блок кода
resource "aws_instance" "web" {
  # ...
  for_each = {
    "tofu": "value1",
    "resource":  "value2",
    "indexing":  "value3",
    "example":   "value4",
  }
}

Адрес вида:

Блок кода
aws_instance.web["example"]

указывает только на экземпляр «example» в конфигурации и разрешается в «value4».

Адреса ресурсов в командной строке​

При использовании адресов ресурсов непосредственно в аргументах командной строки, например в параметрах планирования -target, -exclude и -replace, знаки пунктуации в синтаксисе адресов ресурсов могут конфликтовать со специальной обработкой этих символов командной оболочкой, используемой для запуска OpenTofu.

Чтобы избежать этого, необходимо правильно заключить эти символы в кавычки или экранировать их, чтобы командная оболочка передала их OpenTofu без изменений. Синтаксис зависит от используемой командной оболочки или интерпретатора команд:

  • В оболочках Unix, таких как bash, заключайте адрес ресурса в одинарные кавычки ('):

    Блок кода
    tofu apply -target='aws_instance.example["foo"]'

    Если нужно указать строку ключа экземпляра, содержащую символ одинарной кавычки, используйте две отдельные последовательности в одинарных кавычках, разделённые экранированной одинарной кавычкой. Например, следующий адрес содержит ключ экземпляра "example'foo":

    Блок кода
    tofu apply -target='aws_instance.example["example'\''foo"]'
  • В PowerShell 7.3 или более поздней версии заключайте адрес ресурса в одинарные кавычки ('):

    Блок кода
    tofu apply -target='aws_instance.example["foo"]'

    В более ранних версиях PowerShell действуют другие требования. Дополнительные сведения см. в разделе Передача аргументов, содержащих кавычки.

    Если нужно указать строку ключа экземпляра, содержащую символ одинарной кавычки, используйте две последовательные одинарные кавычки, чтобы обозначить одну буквальную кавычку. Например, следующий адрес содержит ключ экземпляра "example'foo":

    Блок кода
    tofu apply -target='aws_instance.example["example''foo"]'
  • В командной строке Windows (cmd.exe) заключайте адрес ресурса в двойные кавычки ("), а кавычки внутри адреса экранируйте обратной косой чертой (\):

    Блок кода
    tofu apply -target="aws_instance.example[\"foo\"]"

Адреса ресурсов в файлах целевых ресурсов​

Параметры -target-file и -exclude-file планирования считывают адреса ресурсов из отдельного файла, который может содержать ноль или более адресов ресурсов.

OpenTofu обрабатывает файл целевых ресурсов построчно. Каждая строка должна содержать одно из следующего:

  • Адрес ресурса с описанным выше синтаксисом; в этом случае OpenTofu добавляет адрес в набор целевых адресов.
  • Комментарий, начинающийся с символа #; в этом случае OpenTofu полностью игнорирует строку.
  • Пустая строка, состоящая из нуля или более пробелов; в этом случае OpenTofu также полностью игнорирует строку.

Например, следующий файл целевых ресурсов корректен и задаёт несколько адресов ресурсов, которые может потребоваться создать в первую очередь при первом применении определённой конфигурации:

Блок кода
# These modules must be targeted during initial creation.
module.network
module.cluster

# The following resources must also be included on initial
# creation.
aws_iam_role.all["base"]
aws_iam_role_policy.all["base"]

Файл целевых ресурсов выше будет соответствовать всем экземплярам всех ресурсов, адреса которых начинаются с module.network или module.cluster, а также конкретным экземплярам ресурсов aws_iam_role.all["base"] и aws_iam_role_policy.all["base"].

Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.10/cli/state/resource-addressing/

Spec-Zone.ru

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