クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

変数、count、for_eachの使い方

このレッスンのあとで: 変数から、同じ種類のものを複数作れる。

60分のレッスンコマンド13件OpenTofu のラボ:プラン、apply、ステートで学ぶ Infrastructure as Code を1台の VM で

屋台の数は毎年変わる

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 か変数ファイルに書きます。

このラボとソースについて: OpenTofu のラボ:プラン、apply、ステートで学ぶ Infrastructure as Code を1台の VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。