メインコンテンツへスキップ

プロビジョナー接続設定

ほとんどのプロビジョナーは、SSHまたはWinRMを介してリモートリソースにアクセスする必要があり、接続方法の詳細を含むネストされたconnectionブロックを想定しています。

接続ブロック

リモートリソースへのアクセス方法を記述するconnectionブロックを1つ以上作成できます。複数の接続を提供するユースケースの1つは、最初のプロビジョナーがrootユーザーとして接続してユーザーアカウントを設定し、後続のプロビジョナーがより制限された権限を持つユーザーとして接続することです。

接続ブロックはブロックラベルを受け取らず、resourceまたはprovisionerのいずれかにネストできます。

  • resource内に直接ネストされたconnectionブロックは、そのリソースのすべてのプロビジョナーに影響します。
  • provisionerブロックにネストされたconnectionブロックは、そのプロビジョナーのみに影響し、リソースレベルの接続設定をオーバーライドします。

SSH接続タイプは、新しく作成されたリモートリソースで最もよく使用されるため、SSHホストキーの検証はデフォルトで無効になっています。これが受け入れられない場合は、鍵配布のための別のメカニズムを確立し、特定の鍵または署名CAに対して検証するために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オブジェクトを使用できます。これは接続の親リソースを表し、そのリソースのすべての属性を持ちます。たとえば、aws_instancepublic_ip属性を参照するにはself.public_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関数を使用してディスク上のファイルからロードできます。
agentSSHssh-agentを使用して認証を無効にする場合はfalseに設定します。Windowsでは、サポートされている唯一のSSH認証エージェントはPageantです。
agent_identitySSH認証用のsshエージェントからの優先ID。
host_keySSHリモートホストまたは署名CAからの公開鍵。接続の検証に使用されます。
target_platformSSH接続先のターゲットプラットフォーム。有効な値は、"windows""unix"です。プラットフォームがwindowsに設定されている場合、SSHのデフォルトシェルcmd.exeであることを前提として、デフォルトのscript_pathc:\windows\temp\terraform_%RAND%.cmdです。SSHのデフォルトシェルがPowerShellの場合は、script_path"c:/windows/temp/terraform_%RAND%.ps1"に設定します。"unix"
httpsWinRMHTTPではなくHTTPSを使用して接続する場合は、trueに設定します。
insecureWinRMHTTPS証明書チェーンの検証をスキップする場合は、trueに設定します。
use_ntlmWinRMNTLM認証をデフォルト(基本認証)の代わりに使用する場合はtrueに設定します。これにより、ターゲットゲスト内で基本認証を有効にする必要がなくなります。詳細については、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関数を使用して、ディスク上のファイルからロードできます。

SSHを使用したHTTPプロキシ経由での接続

ssh接続は、HTTPプロキシ経由でのSSHによる接続を容易にするために、以下のフィールドもサポートしています。

引数説明デフォルト
proxy_schemehttpまたはhttps
proxy_hostこれを設定すると、HTTP経由のSSH接続が有効になります。最初にこのホストに接続され、そこから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%をランダムに選択された10進数に置き換えます。

プロビジョナーは、TMPDIRなどのリモート環境変数に直接反応したり、mktempのような関数を使用したりすることはできません。これらは、リモートシステムではなく、OpenTofuが実行されているシステムで実行されるためです。したがって、リモートシステムがこれらのデフォルトパスで想定されるファイルシステムレイアウトを使用していない場合は、connectionブロックのscript_pathオプションを使用してオーバーライドできます。

コードブロック
connection {
# ...
script_path = "H:/tofu-temp/script_%RAND%.sh"
}

デフォルトパターンと同様に、プロビジョナーは、複数のプロビジョナーが同時に実行される間の衝突の可能性を減らすために、シーケンス%RAND%をランダムに選択された10進数に置き換えます。

ターゲットシステムがWindowsを実行している場合は、Windowsの一般的な慣例にもかかわらず、バックスラッシュの代わりにスラッシュを使用することをお勧めします。これは、OpenTofu言語がバックスラッシュを引用符付き文字列のエスケープ文字として使用するためです。

SSH/SCPを使用したスクリプトの実行

SSHプロトコルを使用する場合、プロビジョナーはSecure Copy Protocol(SCP)を使用してスクリプトファイルをアップロードします。そのためには、リモートシステムにそのプロトコルのサーバーとして機能するscpサービスプログラムがインストールされている必要があります。

プロビジョナーは、選択されたスクリプトパス(%RAND%展開後)をリモートのscpプロセスに直接渡します。これは、スクリプトパスの解釈を担当します。OpenSSHで配布されているデフォルトのscp構成では、相対パスを指定することで、リモートユーザーのホームディレクトリに一時スクリプトを配置できます。

コードブロック
connection {
type = "ssh"
# ...
script_path = "tofu_provisioner_%RAND%.sh"
}