1回書けば、何度でも作れる
学校が、どの教室にも同じ10台のパソコンを同じ設定で置きたいと考えています。手作業で10回やると、少しずつ違う10の教室ができてしまいます。Infrastructure as Code(コードによるインフラ管理)では、教室のかたちをファイルに書きます。ツールがそのファイルのとおりに何度でも作り、変更する前に、何が変わるかを見せてくれます。
このレッスンが終わると
メモ
プランとは何か、ステートは何のためにあるか、そしてツールが変更の前にプランを出す理由を説明できる。
キーワード
- OpenTofu:ファイルを読み、書かれたとおりのものを作る、無料のオープンソースのツール。
- リソース:ファイルが説明する1つのもの。ここでは値を1つ持つだけで、プロバイダーがあればサーバーにもなる。
- プラン:OpenTofu が行う変更の一覧。実行する前に表示される。
- Apply(適用):プランに並んだ変更を実際に行うこと。
- ステート(state):OpenTofu がすでに作ったものを記録するファイル。
- プロバイダー:本物のクラウドと話すプラグイン。このマシンではダウンロードできない。
ウォームアップ:すでに知っていること
メモ
頭の中で答えましょう。1. プログラムの変数とは何ですか。2. お茶を2回頼んだら、1杯来ますか、2杯来ますか。3. 次の日にやることリストは何の役に立ちますか。この3つは、すぐに出てきます。
はじめる前に
メモ
このレッスンの上のバーにある ラボを開始 を押します。このラボは、あなた専用の Ubuntu マシン まるごとなので、コンテナより起動に少し時間がかかります。また初回は OpenTofu をダウンロードするので、無料アカウントが必要です。各 実行 ボタンは、そのコマンドをマシンのターミナルに、同じセッションで順番に入力します。マシンがまだ起動中と表示されたら、数秒待ってからもう一度押します。様子を見たり自分で入力したりするには、バーの ターミナルを開く を押します。
プロジェクトはファイルの入ったフォルダー
ラボには、いちばん小さなプロジェクトが ~/tofu-lab/hello に用意されています。cd でそこへ移動します。main.tf には、組み込みの種類 terraform_data の リソース が hello という名前で1つあります。値 "hello" を input(入力)として持ち、output(出力)として返します。もう1つのブロックがその出力を表示します。OpenTofu の外には何も作られません。このラボには、ものを作るクラウドがないからです。
cd ~/tofu-lab/helloここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
cat main.tfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
プラン:変更の前に見る
tofu init はフォルダーを準備します。本物のプロジェクトでは、ここでプロバイダーをダウンロードします。このプロジェクトには取得するものがないので、すぐに終わります。次に tofu plan が、ファイルとステートを比べて、何をするかを表示します。+ は作成を意味し、最後の行が合計です:Plan: 1 to add, 0 to change, 0 to destroy. プランは何も変更しません。
tofu initここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
tofu planここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Apply:実行して、記録させる
tofu apply は、プランに並んだことを実行します。-auto-approve がないと、先に yes と入力するよう求められます。ラボではボタンが代わりに入力できるよう、これを付けています。最後に Apply complete! Resources: 1 added, 0 changed, 0 destroyed. と出ます。リソースはステートに記録されました。tofu state list で、ステートに入っているものが分かります。
tofu apply -auto-approveここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
tofu state listここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
チェック
ヒント
何かを変更するコマンドはどれで、変更する内容を教えるだけのコマンドはどれですか。答え: 変更するのは tofu apply、教えるだけなのは tofu plan です。すぐにもう一度プランを実行すると、何と表示されますか。答え: No changes. Your infrastructure matches the configuration. です。ステートに、ファイルの内容がすでに入っているからです。試してみましょう。
よくある間違い
注意
「OpenTofu は毎回、現実の世界を見て何があるかを調べる」と思う人は多いです。そうではありません。OpenTofu はファイルを自分の記録である ステート と比べます。ステートが「ある」と言うものを、あると信じます。だからステートは、それが記録しているインフラと同じくらい大切です。
値を1つ変えて、プランを読む
次のコマンドは、sed(検索と置換)でファイルの "hello" を "goodbye" に変えます。すると tofu plan は、新しいものと変わったものを区別しなければなりません。~ はその場で変更するという意味で、古い値と新しい値が並んで表示され、最後の行は Plan: 0 to add, 1 to change, 0 to destroy. になります。適用の前にプランを読む。この習慣のためにこのツールはあります。
sed -i 's/input = "hello"/input = "goodbye"/' main.tfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
tofu planここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ステートはファイル。なくなると OpenTofu は忘れる
このフォルダーでは、ステートは terraform.tfstate という普通のファイルです。これを削除すると、OpenTofu は記録を失います。するとプランは、すでに作ったリソースについて 1 to add と言います。OpenTofu にとっては、何も存在しないからです。本物のクラウドなら、すべてのコピーがもう1つ作られてしまいます。だから実際のチームは、ステートを安全な場所に置き、手で編集しません。あとで sudo tofulab reset hello を実行すると、このフォルダーが最初の状態に戻ります。
rm terraform.tfstateここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
tofu planここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
最後のチェック
ヒント
前を見ないで答えましょう。1. tofu plan は何を変更しますか。2. ステートは何を記録しますか。3. apply のあとにもう一度プランを実行すると、何と言いますか。4. このマシンが本物のサーバーを作れないのはなぜですか。答え: 何も変更しない。OpenTofu がすでに作ったもの。やることはなし。プロバイダーがないから。プロバイダーがクラウドと話すものだからです。準備ができたら、ターミナルで cat ~/README.md を実行して、ラボの説明を読みましょう。
先生へ
ヒント
このレッスンは、ラボで進めるレッスンの小さな例です。ステップと実行ボタンがレッスンで、ラボは生徒それぞれのコピーです。VM ラボで行い、生徒はそれぞれ OpenTofu が入った自分の Ubuntu マシンを持ち、実行ボタンはそのターミナルに入力して、表示された結果を見せます。無料アカウントが必要です(マシンが GitHub から OpenTofu をダウンロードします)。学習のポイント:1. プランは、変更の前に変更内容を見せる。2. ステートは、OpenTofu が作ったものの記録である。3. 同じファイルをもう一度適用しても何も変わらない。よくある間違い:OpenTofu がステートではなく現実の世界を見ていると思うこと。ラボは組み込みの terraform_data リソースだけを使うので、本物は何も作られません。本物のプロバイダーには、このラボにはないネットワークが必要です。レッスンのあとは sudo tofulab reset hello でフォルダーが元に戻ります。ラボ自体には、生徒のプロジェクトを独自の値でプランして適用するチェックがあります。レッスンは自分のモジュールにコピーして変更するか、レッスンビルダーの ラボ メニューでゼロから作れます。