背景
tfenv と .terraform-version ファイルを組み合わせることで、指定されたバージョンの Terraform を利用することができる。
.terraform-version ファイルは手動で作成する必要があるが、もうちょっと楽に作りたい。
対応
Terraform のヘルパーライブラリである terraform-config-inspect を利用し、Go を書く。
terraform-config-inspect の tfconfig に LoadModule というファンクションがあり、コールするだけで設定ファイルをパースしてくれる。
import "github.com/hashicorp/terraform-config-inspect/tfconfig"
module, _ := tfconfig.LoadModule(".")
constraint := module.RequiredCore[0]
これだけで constraint
には "= 1.1.0"
のようなバージョン制約の文字列が入る。
module
の構造は以下の通り。
あとは正規表現などでバージョン部分を取り出し Print すれば標準出力できるので、リダイレクトでファイル化するとよい。
tfvergen
上記をバイナリ化した。
$ cat config.tf
terraform {
required_version = "= 1.0.7"
}
: (omitted)
のような tf ファイルがカレントディレクトリにある状態でバイナリを実行すると、required_version で指定されている .terraform-version を生成できる。
$ tfvergen > .terraform-version
$ cat .terraform-version
1.0.7
以下のようなワンライナーを実行すると、カレントディレクトリ以下の config.tf があるディレクトリに対して再帰的に .terraform-version を作成することができる (はず)。
$ find . -type f -name 'config.tf' | xargs -L1 bash -c 'cd $(dirname $1) && tfvergen > .terraform-version' _