Spec-Zone.ru › OpenTofu 1.9

Настройки подключения провижионера

Большинству провижионеров требуется доступ к удаленному ресурсу через SSH или WinRM, и они ожидают вложенный блок connection с данными о подключении.

Важно

Используйте провижионеры только в крайнем случае. В большинстве ситуаций есть более подходящие альтернативы. Дополнительные сведения см. в разделе Объявление провижионеров.

Блок подключения​

Можно создать один или несколько блоков connection с описанием доступа к удаленному ресурсу. Например, можно указать несколько подключений, чтобы первоначальный провижионер подключался как пользователь root для настройки учетных записей, а последующие провижионеры подключались как пользователь с более ограниченными разрешениями.

Блоки подключения не принимают метку блока и могут быть вложены в блок resource или provisioner.

  • Блок connection, вложенный непосредственно в блок resource, влияет на все провижионеры этого ресурса.
  • Блок connection, вложенный в блок provisioner, влияет только на этот провижионер и переопределяет любые настройки подключения на уровне ресурса.

Поскольку тип подключения SSH чаще всего используется с недавно созданными удаленными ресурсами, проверка ключей хоста SSH по умолчанию отключена. Если это неприемлемо, можно настроить отдельный механизм распространения ключей и явно задать аргумент host_key (подробности ниже), чтобы проверять подключение по определенному ключу или подписывающему центру сертификации.

Пример использования​

Блок кода
# Copies the file as the root user using SSH
provisioner "file" {
  source      = "conf/myapp.conf"
  destination = "/etc/myapp.conf"

  connection {
    type     = "ssh"
    user     = "root"
    password = "${var.root_password}"
    host     = "${var.host}"
  }
}

# Copies the file as the Administrator user using WinRM
provisioner "file" {
  source      = "conf/myapp.conf"
  destination = "C:/App/myapp.conf"

  connection {
    type     = "winrm"
    user     = "Administrator"
    password = "${var.admin_password}"
    host     = "${var.host}"
  }
}

Объект self​

Выражения в блоках connection не могут ссылаться на родительский ресурс по имени. Ссылки создают зависимости, и ссылка на ресурс по имени внутри его собственного блока создала бы цикл зависимостей. Вместо этого в выражениях можно использовать объект self, который представляет родительский ресурс подключения и содержит все атрибуты этого ресурса. Например, используйте self.public_ip, чтобы обратиться к атрибуту public_ip ресурса aws_instance.

Справочник аргументов​

Блок connection поддерживает следующие аргументы. Некоторые аргументы поддерживаются только для типа подключения SSH или WinRM.

Аргумент Тип подключения Описание По умолчанию
type Оба Тип подключения. Допустимые значения: "ssh" и "winrm". При использовании WinRM провижионеры обычно предполагают, что на удаленной системе работает Microsoft Windows. Поведение, зависящее от SSH target_platform, принудительно включает специфичное для Windows поведение WinRM, если не указано иное. "ssh"
user Оба Пользователь, от имени которого устанавливается подключение. root для типа "ssh"
Administrator для типа "winrm"
password Оба Пароль для подключения.
host Оба Обязательно — адрес ресурса, к которому нужно подключиться.
port Оба Порт для подключения. 22 для типа "ssh"
5985 для типа "winrm"
timeout Оба Время ожидания доступности подключения. Значение следует указывать в виде строки (например, "30s" или "5m"). "5m"
script_path Оба Путь для копирования сценариев, предназначенных для удаленного выполнения. Дополнительные сведения см. ниже в разделе Как провижионеры выполняют удаленные сценарии. (подробности ниже)
private_key SSH Содержимое ключа SSH для подключения. Его можно загрузить из файла на диске с помощью функции file. Если это значение указано, оно имеет приоритет над password.
certificate SSH Содержимое подписанного сертификата центра сертификации (CA). Аргумент сертификата необходимо использовать вместе с private_key. Сертификат можно загрузить из файла на диске с помощью функции file.
agent SSH Установите значение false, чтобы отключить аутентификацию с помощью ssh-agent. В Windows поддерживается только агент аутентификации SSH Pageant.
agent_identity SSH Предпочитаемый идентификатор из агента ssh для аутентификации.
host_key SSH Открытый ключ удаленного хоста или подписывающего центра сертификации, используемый для проверки подключения.
target_platform SSH Целевая платформа для подключения. Допустимые значения: "windows" и "unix". Если для платформы задано значение windows, значением script_path по умолчанию будет c:\windows\temp\terraform_%RAND%.cmd, если оболочкой SSH по умолчанию является cmd.exe. Если оболочкой SSH по умолчанию является PowerShell, задайте для script_path значение "c:/windows/temp/terraform_%RAND%.ps1" "unix"
https WinRM Установите значение true, чтобы подключаться через HTTPS, а не HTTP.
insecure WinRM Установите значение true, чтобы пропустить проверку цепочки сертификатов HTTPS.
use_ntlm WinRM Установите значение true, чтобы использовать аутентификацию NTLM вместо стандартной (базовой аутентификации), устранив необходимость включать базовую аутентификацию в целевой гостевой системе. Дополнительные сведения см. в разделе Аутентификация для удаленных подключений документации по разработке приложений Windows.
cacert WinRM Сертификат CA для проверки.

Подключение через бастионный хост по SSH​

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

Аргумент Описание По умолчанию
bastion_host Включает подключение через бастионный хост. Провижионер сначала подключится к bastion_host, а затем оттуда — к host.
bastion_host_key Открытый ключ удаленного хоста или подписывающего центра сертификации, используемый для проверки подключения к хосту.
bastion_port Порт для подключения к бастионному хосту. Значение поля port.
bastion_user Пользователь для подключения к бастионному хосту. Значение поля user.
bastion_password Пароль для подключения к бастионному хосту. Значение поля password.
bastion_private_key Содержимое файла ключа SSH для подключения к бастионному хосту. Его можно загрузить из файла на диске с помощью функции file. Значение поля private_key.
bastion_certificate Содержимое подписанного сертификата центра сертификации (CA). Аргумент сертификата необходимо использовать вместе с bastion_private_key. Сертификат можно загрузить из файла на диске с помощью функции file.

Подключение через HTTP-прокси по SSH​

Подключение ssh также поддерживает следующие поля для подключения по SSH через HTTP-прокси.

Аргумент Описание По умолчанию
proxy_scheme http или https
proxy_host Включает подключение SSH через HTTP. Сначала будет установлено подключение к этому хосту, а затем оттуда — подключение host или bastion_host.
proxy_port Порт для подключения к прокси-хосту.
proxy_user_name Имя пользователя для подключения к закрытому прокси-хосту. Этот аргумент следует указывать только в том случае, если для HTTP-прокси требуется аутентификация.
proxy_user_password Пароль для подключения к закрытому прокси-хосту. Этот аргумент следует указывать только в том случае, если для HTTP-прокси требуется аутентификация.

Как провижионеры выполняют удаленные сценарии​

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

Однако у этого подхода есть некоторые последствия, которые могут иметь значение в отдельных необычных ситуациях, несмотря на то, что при обычном использовании это лишь деталь реализации.

Важнее всего то, что в удаленной файловой системе должно быть подходящее место, где провижионер сможет создать файл сценария. По умолчанию OpenTofu выбирает путь, содержащий случайное число, используя следующие шаблоны в зависимости от значения target_platform:

  • "unix": /tmp/terraform_%RAND%.sh
  • "windows": C:/windows/temp/terraform_%RAND%.cmd

В обоих приведенных выше случаях провижионер заменяет последовательность %RAND% случайно выбранными десятичными цифрами.

Провижионеры не могут напрямую использовать переменные среды удаленной системы, например TMPDIR, или такие функции, как mktemp, поскольку они выполняются в системе, где запущен OpenTofu, а не в удаленной системе. Поэтому, если файловая структура удаленной системы отличается от той, на которую рассчитаны пути по умолчанию, ее можно переопределить с помощью параметра script_path в блоке connection:

Блок кода
connection {
  # ...
  script_path = "H:/tofu-temp/script_%RAND%.sh"
}

Как и в шаблонах по умолчанию, провижионеры заменяют последовательность %RAND% случайно выбранными десятичными цифрами, чтобы снизить вероятность конфликтов при одновременном запуске нескольких провижионеров.

Если целевая система работает под управлением Windows, рекомендуется использовать косые черты вместо обратных, несмотря на то что в Windows обычно принято обратное: в языке OpenTofu обратная косая черта используется для экранирования символов в строках.

Выполнение сценариев с помощью SSH/SCP​

При использовании протокола SSH провижионеры загружают файлы сценариев с помощью протокола безопасного копирования (SCP), для работы которого в удаленной системе должна быть установлена служебная программа scp, выступающая сервером этого протокола.

Провижионеры передают выбранный путь к сценарию (после подстановки %RAND%) непосредственно удаленному процессу scp, который отвечает за его интерпретацию. При стандартной конфигурации scp, поставляемой вместе с OpenSSH, можно размещать временные сценарии в домашнем каталоге удаленного пользователя, указав относительный путь:

Блок кода
connection {
  type = "ssh"
  # ...
  script_path = "tofu_provisioner_%RAND%.sh"
}

Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/resources/provisioners/connection/

Spec-Zone.ru

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