- OpenTofu言語
- リソース
- プロビジョナー
- プロビジョナー接続設定
プロビジョナー接続設定
ほとんどのプロビジョナーは、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_instance
のpublic_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_key | SSH | 接続に使用するSSHキーの内容。これらは、file 関数を使用してディスク上のファイルからロードできます。提供されている場合、これはpassword よりも優先されます。 | |
certificate | SSH | 署名されたCA証明書の内容。証明書引数は、private_key と組み合わせて使用する必要があります。これらは、file 関数を使用してディスク上のファイルからロードできます。 | |
agent | SSH | ssh-agent を使用して認証を無効にする場合はfalse に設定します。Windowsでは、サポートされている唯一のSSH認証エージェントはPageantです。 | |
agent_identity | SSH | 認証用のsshエージェントからの優先ID。 | |
host_key | SSH | リモートホストまたは署名CAからの公開鍵。接続の検証に使用されます。 | |
target_platform | SSH | 接続先のターゲットプラットフォーム。有効な値は、"windows" と"unix" です。プラットフォームがwindows に設定されている場合、SSHのデフォルトシェルがcmd.exe であることを前提として、デフォルトのscript_path はc:\windows\temp\terraform_%RAND%.cmd です。SSHのデフォルトシェルがPowerShellの場合は、script_path を"c:/windows/temp/terraform_%RAND%.ps1" に設定します。 | "unix" |
https | WinRM | HTTPではなくHTTPSを使用して接続する場合は、true に設定します。 | |
insecure | WinRM | HTTPS証明書チェーンの検証をスキップする場合は、true に設定します。 | |
use_ntlm | WinRM | NTLM認証をデフォルト(基本認証)の代わりに使用する場合はtrue に設定します。これにより、ターゲットゲスト内で基本認証を有効にする必要がなくなります。詳細については、Windowsアプリ開発ドキュメントのリモート接続の認証を参照してください。 | |
cacert | WinRM | 検証に使用する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_scheme | httpまたは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"
}