跳至主要内容

供应器连接设置

大多数供应器需要通过 SSH 或 WinRM 访问远程资源,并期望一个嵌套的 connection 块,其中包含有关如何连接的详细信息。

连接块

您可以创建一个或多个 connection 块来描述如何访问远程资源。提供多个连接的一个用例是让初始供应器以 root 用户身份连接以设置用户帐户,然后让后续供应器以具有更多限制权限的用户身份连接。

连接块不采用块标签,并且可以嵌套在 resourceprovisioner 中。

  • 直接嵌套在 resource 中的 connection 块会影响该资源的所有供应器。
  • 嵌套在 provisioner 块中的 connection 块仅影响该供应器,并覆盖任何资源级别的连接设置。

由于 SSH 连接类型最常用于新创建的远程资源,因此默认情况下会禁用 SSH 主机密钥的验证。如果这是不可接受的,您可以建立一个单独的密钥分发机制,并明确设置 host_key 参数(如下所述)以针对特定密钥或签名 CA 进行验证。

示例用法

代码块
# 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 来引用 aws_instancepublic_ip 属性。

参数参考

connection 块支持以下参数。某些参数仅受 SSH 或 WinRM 连接类型支持。

参数连接类型描述默认值
type两者连接类型。有效值为 "ssh""winrm"。供应器通常假设使用 WinRM 时远程系统运行 Microsoft Windows。基于 SSH target_platform 的行为将强制 WinRM 使用 Windows 特定行为,除非另有说明。"ssh"
user两者用于连接的用户。对于类型 "ssh"root
对于类型 "winrm"Administrator
password两者用于连接的密码。
host两者必需 - 要连接到的资源的地址。
port两者要连接到的端口。对于类型 "ssh"22
对于类型 "winrm"5985
timeout两者等待连接变为可用时的超时时间。应作为字符串提供(例如,"30s""5m")。"5m"
script_path两者用于复制用于远程执行的脚本的路径。有关更多详细信息,请参阅下面的 供应器如何执行远程脚本(详细信息如下)
private_keySSH用于连接的 SSH 密钥的内容。可以使用 file 函数 从磁盘上的文件加载这些内容。如果提供,则此项优先于 password
certificateSSH已签名 CA 证书的内容。证书参数必须与 private_key 结合使用。可以使用 file 函数 从磁盘上的文件加载这些内容。
agentSSH设置为 false 以禁用使用 ssh-agent 进行身份验证。在 Windows 上,唯一受支持的 SSH 身份验证代理是 Pageant
agent_identitySSH用于身份验证的首选 SSH 代理身份。
host_keySSH来自远程主机或签名 CA 的公钥,用于验证连接。
target_platformSSH要连接到的目标平台。有效值为 "windows""unix"。如果平台设置为 windows,则默认 script_pathc:\windows\temp\terraform_%RAND%.cmd,假设 SSH 默认 shellcmd.exe。如果 SSH 默认 shell 为 PowerShell,请将 script_path 设置为 "c:/windows/temp/terraform_%RAND%.ps1""unix"
httpsWinRM设置为 true 以使用 HTTPS 而不是 HTTP 连接。
insecureWinRM设置为 true 以跳过验证 HTTPS 证书链。
use_ntlmWinRM设置为 true 以使用 NTLM 身份验证而不是默认值(基本身份验证),从而无需在目标客户机中启用基本身份验证。有关更多详细信息,请参阅 Windows 应用开发文档中的 远程连接的身份验证
cacertWinRM要验证的 CA 证书。

通过 SSH 使用堡垒主机连接

ssh 连接还支持以下参数,以便通过 堡垒主机 间接连接。

参数描述默认值
bastion_host设置此项将启用堡垒主机连接。供应器将首先连接到 bastion_host,然后从那里连接到 host

bastion_host_key远程主机或签名 CA 的公钥,用于验证主机连接。
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 连接还支持以下字段,以方便通过 HTTP 代理进行 SSH 连接。

参数描述默认值
proxy_schemehttp 或 https
proxy_host设置此项将启用通过 HTTP 连接 SSH。首先将连接到此主机,然后从那里建立 hostbastion_host 连接。
proxy_port连接到代理主机的端口。
proxy_user_name连接到私有代理主机使用的用户名。仅当 HTTP 代理服务器需要身份验证时才应指定此参数。
proxy_user_password连接到私有代理主机使用的密码。仅当 HTTP 代理服务器需要身份验证时才应指定此参数。

配置器如何执行远程脚本

通过 SSH 等协议在远程系统上执行命令的配置器通常通过将脚本文件上传到远程系统,然后要求默认 shell 执行该文件来实现。配置器使用此策略是因为它允许您使用该 shell 支持的所有典型脚本技术,包括在脚本语句之间保留环境变量值和其他上下文。

但是,这种方法确实有一些后果,即使这在典型使用中只是一个实现细节,但在某些异常情况下也可能相关。

最重要的是,远程文件系统中必须有一个合适的位置,配置器可以在其中创建脚本文件。默认情况下,OpenTofu 会根据 target_platform 的设置方式选择包含随机数的路径,使用以下模式

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

在以上两种情况下,配置器都会将序列 %RAND% 替换为一些随机选择的十进制数字。

配置器无法直接对远程环境变量(如 TMPDIR)做出反应,也无法使用 mktemp 等函数,因为它们在运行 OpenTofu 的系统上运行,而不是在远程系统上运行。因此,如果您的远程系统未使用这些默认路径所期望的文件系统布局,则可以使用 connection 块中的 script_path 选项覆盖它。

代码块
connection {
# ...
script_path = "H:/tofu-temp/script_%RAND%.sh"
}

与默认模式一样,配置器将用随机选择的十进制数字替换序列 %RAND%,以降低多个配置器并发运行时发生冲突的可能性。

如果您的目标系统正在运行 Windows,我们建议使用正斜杠而不是反斜杠,尽管 Windows 上的典型约定是使用反斜杠,因为 OpenTofu 语言使用反斜杠作为引号字符串的转义字符。

使用 SSH/SCP 执行脚本

使用 SSH 协议时,配置器使用安全复制协议 (SCP) 上传其脚本文件,这需要远程系统安装 scp 服务程序才能充当该协议的服务器。

配置器会将选定的脚本路径(在 %RAND% 展开之后)直接传递给远程 scp 进程,该进程负责解释它。使用与 OpenSSH 一起分发的 scp 的默认配置,您可以通过指定相对路径将临时脚本放在远程用户的 home 目录中。

代码块
connection {
type = "ssh"
# ...
script_path = "tofu_provisioner_%RAND%.sh"
}