Ansible ロールのラボ:ロール、ハンドラー、Vault を1台の Ubuntu VM で

このラボは「Ansible の基本」ラボの2段階目です。生徒ごとに、ansible-core の入った自分専用の Ubuntu VM、小さなプロジェクト、README が渡され、1つのロールをゼロから作ります。変数、テンプレート、タグ付きのタスク、ハンドラー、そして Ansible Vault に入れたトークンです。マシン自身がローカル接続の対象なので、ほかに必要なものはありません。

生徒のコンピューターには何もインストールしません。先に「Ansible の基本」を行います。そこではプレイブック、パッケージ、テンプレート、プレイブックを2回実行することを学ぶので、このラボでは繰り返しません。

生徒が学ぶこと

プレイブックがロールへと育つ流れです。生徒はネットワークがなくても動く ansible-galaxy role init で標準のフォルダーを作り、tasks、defaults、vars、templates、handlers、meta を埋めます。変数がどの順番で勝つかを自分で確かめます。ロールの defaults はプレイに置いた変数に負け、ロール自身の vars はそれに勝ち、-e で渡した値はすべてに勝ちます。ループと条件を使う Jinja2 のテンプレートを書いて --check と --diff で確かめ、loop、register、when を使い、--tags と --limit で一部のタスクだけを実行します。

3つのタスクが知らせるハンドラーは1回だけ実行されなければならず、生徒はロールが途中でハンドラーを実行するようにします。最後は Ansible Vault です。ansible-vault で作ったファイルをパスワードファイルで開き、トークンはほかのどこにも平文で書きません。作業はすべて Ansible 標準のモジュールで、チェックが見られるファイル、フォルダー、システムユーザーに対して行います。

プロジェクト

生徒は、この1台のマシンに2つの名前を付けたインベントリ、まだ存在しないロールを使うプレイブック、秘密ではないと書かれた偽の vault パスワードが入ったフォルダーから始めます。プレイブックはすでにプレイに2つの変数を置いているので、優先順位は読むものではなく、生徒が正しく答えを出すものです。マシンは小さく、CPU 1つ、メモリ 1 GB、ディスク 10 GB です。

ブラウザーで動かす

VM ラボは、モジュールのラボタスクとして出し、サンプルはラボのページにあります。このラボは Ubuntu のアーカイブだけを使うので、無料アカウントの VM でも動きます。

  1. ラボを追加する. 担当するモジュールでタスクを追加し、Ubuntu VM ラボのカードを選びます。ページには compose ファイルの代わりに、マシンの短い説明が表示されます。
  2. サンプルから始める. ページには、すぐ使えるラボが用意されています。Ansible roles, handlers and vault を選びます。サンプルを使うとテキストが置き換わり、元に戻すで自分のテキストを取り戻せます。
  3. 公開して自分用のコピーを起動する. 公開してから開始を押します。VM の初回起動時に、ラボの setup スクリプトが Ubuntu のアーカイブから ansible-core をインストールし、プロジェクト、プレイブック、練習用の偽の vault パスワード、README を作ります。1、2分かかります。
  4. ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。7つの手順で何をするかが書かれていて、答えは書かれていません。

このラボの基本レッスン

Ansible Roles Basics は、このラボ(Ubuntu VM)で進める小さなレッスンです。導入、「できる」で書く目標、キーワード、ウォームアップ、各アイデアのあとのチェック、よくある間違い、最後のチェックがあり、各ステップには、そのコマンドをマシンのターミナルに入力する実行ボタンがあります。生徒は使い捨てのロールを作ってフォルダーを見て、小さなプレイブックを2回実行して変数が -e に負けるのを見て、2つの通知に対してハンドラーが1回だけ実行されるのを確かめ、Vault で値を暗号化します。

レッスンは見て回るだけで、ラボ自身のロールは生徒に任せるので、答えは配りません。

採点の仕組み

ラボにはチェックがあります。新しく起動した、保存済みのマシンのコピーで実行されます。まずロールを読みます。標準のフォルダー、埋められた meta ファイル、プレイブックではなくロールの中にある6つ以上のタスク、ハンドラー、ループ、タグ、for ループと if を持つテンプレートです。shell、command、raw、script、プログラムを実行するルックアップは受け付けません。ラボのパスワードで vault ファイルを開き、プロジェクトに平文で書かれたトークンも受け付けません。

そのあと、誰も見たことのない値で、生徒自身のプレイブックを7回実行します。きれいなマシンで、変更するものが何も残っていない状態でもう一度、変更を表示して何も書かないドライラン、別の値、各タグ、プレイが使わないホストへの --limit です。実際の出力でハンドラーの実行回数を数えるので、3回実行されるハンドラーは受け付けられず、できたファイルも読みます。出力の1行目が理由を伝えます。

  1. 配る. 他のタスクと同じようにラボを割り当てます。希望すれば期限も付けられます。生徒ごとに専用の VM が用意され、セッションをまたいで保たれます。
  2. チェックを実行する. クラス一覧で生徒の行にあるチェックを実行を押します。保存されたマシンのコピー(保存し直されません)を起動し、ラボのチェックスクリプトを root で実行して、合格したか、何を出力したか、いつ実行したかを表示します。結果は生徒には伝わりません。
  3. 採点する. チェックの出力の1行目を読みます。ハンドラーが3回実行された、変数を置く場所が違う、vault ファイルが開かない、など何が正しくないかが書かれています。足りなければ理由を添えて差し戻します。

GitHub の定義ファイル

このファイルがラボの定義のすべてで、プラットフォームが実行するものと同じテキストです。サイズ、setup スクリプト、README、チェックが入っています。コピーして、ロール、変数、ハンドラーを変えれば、もっと長いラボが作れます。

このラボを試す、そして費用

無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。

よくある質問

ラボにライセンスや有料の Ansible は必要ですか。
いいえ。ansible-core はオープンソースで Ubuntu のアーカイブに入っており、生徒の VM の起動時にインストールされます。私たちは何も配布せず、ほかの場所から何かをダウンロードすることもありません。
再起動するサービスがないのはなぜですか。
ラボは、チェックが見られるものでハンドラーを示します。実際の実行の出力から数えた実行回数と、ハンドラーが書くファイルです。本物のサービスの再起動はチェックでは証明できないので、ラボはそれを外し、そのことを明記しています。
生徒が何かを壊すことはありますか。
壊せるのは自分のコピーだけです。マシンが届くのは Ubuntu のアーカイブ、PyPI、npm、GitHub だけです。vault パスワードはラボのためにプロジェクトに置かれた偽のもので、トークンはデモ用のデータであり、本物の秘密ではありません。
ラボは本物の生徒の VM でテストしましたか。
setup、レッスンのコマンド、そして偽の答えに対するチェックの動きは、VM の代わりのコンテナの中の本物の Ubuntu 26.04 で実行しました。ディスクイメージから起動する本物の生徒の VM では、授業の前に一度試すことをおすすめします。