Terraform: -chdir でディレクトリを移動せずに別のルートモジュールを操作する
terraform -chdir=envs/prod plan のように、サブコマンドの前に -chdir=DIR を付けると、cd せずにそのディレクトリで実行したのと同じになる。
いつ使うか
envs/dev・envs/prod のように環境ごとにルートモジュールを分けたリポジトリで、リポジトリのルートに居たまま操作したいとき。Makefile や CI のスクリプトで cd → 実行 → cd - を書かずに済む。
bash
terraform -chdir=envs/prod init
terraform -chdir=envs/prod plan -out=tfplan
terraform -chdir=envs/prod apply tfplan注意点
- グローバルオプションなのでサブコマンドより前に書く。
terraform plan -chdir=...の位置では効かない。 -out=tfplanや-var-file=などの相対パスは、移動先(envs/prod)からの相対になる。- 例外が2つ:
- CLI 設定ファイル(
.terraformrcなど)は-chdirを処理する前に読まれる。 - 設定内の
path.cwdは元のディレクトリを指す。ルートモジュールの場所が欲しいならpath.rootを使う。
- CLI 設定ファイル(
- 昔の
terraform plan DIRのようにディレクトリを引数で渡す書き方は v0.15 で削除済み。その代わりが-chdir。 - CI で毎回同じフラグを足すなら
TF_CLI_ARGS_plan="-input=false"のような環境変数も使える(こちらはサブコマンドの直後に挿入される)。