屋台の数は毎年変わる
OpenTofu の変数(variable)とは、ファイルの値を外から変えられるようにする仕組みです。count と for_each を使うと、同じ書き方から、リソースをいくつでも作れます。
学園祭の屋台は、年によって3軒だったり30軒だったりします。書き方を1つ決めて、数や名前だけを変数で渡せば、ファイルを書き直さずに済みます。
このレッスンのゴール
メモ
変数から、同じ種類のものを複数作れる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 変数 | 外から値を渡せる、名前のついた入れ物 | var.tables |
| 既定値 | 値を渡さなかったときに使われる値 | default = 2 |
| 出力値 | apply のあとに画面へ出す値 | output |
| count | 数と同じだけ、同じリソースを作る指定 | |
| for_each | 名前の集まりの1つずつに、リソースを作る指定 | |
| アドレス | リソースを指す名前 | terraform_data.table[0] |
学生が入力するセルは、このプレビューでは空白です。
変数は値を外から渡す口
variable ブロックで、変数を宣言します。type が型で、default が既定値です。ファイルの中では var.名前 で読みます。
実行のときは、-var 名前=値 で値を渡せます。output ブロックは、apply のあとに値を画面へ出します。
countは数だけ同じものを作る
count = 3 と書くと、同じリソースが3つできます。番号は0から数え、count.index で読みます。
アドレスは terraform_data.table[0]、[1]、[2] です。今回は join という関数で、文字をつなげます。tofu console に式を送ると、関数の答えをすぐ試せます。
自分のフォルダを作る
mkdir ~/festivalここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
そのフォルダに入る
cd ~/festivalここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
関数を試す
echo 'join(" ", ["table", 1])' | tofu consoleここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
変数、count、出力値を書く
printf '%s\n' 'variable "tables" {' ' type = number' ' default = 2' '}' '' 'resource "terraform_data" "table" {' ' count = var.tables' ' input = join(" ", ["table", count.index + 1])' '}' '' 'output "table_count" {' ' value = length(terraform_data.table)' '}' > main.tfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
フォルダを整える
tofu init -no-color | grep successここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
既定値の2つを作る
tofu apply -auto-approve -no-color | grep Applyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
できたアドレスを見る
tofu state listここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力値を見る
tofu outputここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
値を渡して3つにする
tofu apply -auto-approve -no-color -var tables=3 | grep Applyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
for_eachは名前ごとに作る
for_each に map(名前と値の組)を渡すと、名前ごとにリソースが1つできます。中では each.key が名前、each.value が値です。
アドレスは terraform_data.booth["takoyaki"] のように、番号でなく名前で呼ばれます。名前で呼ぶので、1つ消えても、ほかの名前は動きません。
mapの変数とfor_eachを足す
printf '%s\n' '' 'variable "prices" {' ' type = map(number)' ' default = {' ' takoyaki = 500' ' yakisoba = 600' ' }' '}' '' 'resource "terraform_data" "booth" {' ' for_each = var.prices' ' input = each.value' '}' >> main.tfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
屋台を作る(tablesは既定値)
tofu apply -auto-approve -no-color | grep Applyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
アドレスを見直す
tofu state listここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
mapから1つ外したplan
tofu plan -no-color -var 'prices={yakisoba=600}' | grep -E "will be|Plan:"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
-var tables=3 で渡した値は、ずっと残ると思いがちです。実際は、その1回の命令だけです。次に値を渡さず apply すると、既定値の2に戻り、table[2] が消えます。残したい値は、default か変数ファイルに書きます。