Настройки подключения провижионера
Большинству провижионеров требуется доступ к удаленному ресурсу через 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/