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

無料レッスン

Ansible ロールの基礎

レッスン全文をここで読めます。無料アカウントを作成すると、実際のラボで実践できます。

仮想マシンラボ読了目安 15分コマンド7個

3つの教室、準備のしかたは1つ

ある学校が、コンピューター室を3つ準備します。最初のプレイブックは、みんなが書き足していく長い1つのファイルで、6月には誰も触れなくなります。ロール(role)は、そのファイルを決まったフォルダーに分けたものです。準備の一部を、再利用したり、共有したり、そこだけ変えたりできます。

このレッスンが終わると

メモ

ロールに何が入っているか、そしてハンドラーが1回しか実行されない理由を説明できます。

キーワード

  • ロール(role):tasks や defaults など、決まったフォルダーに分けたプレイブック。
  • 変数:タスクが使える値を入れておく名前。
  • 優先順位(precedence):同じ名前の変数が2つあるとき、どちらが勝つかを決める順番。
  • ハンドラー(handler):ほかのタスクに頼まれたときだけ実行されるタスク。
  • Vault:Ansible がファイルを暗号化したまま保管する仕組み。

ウォームアップ:すでに知っていること

メモ

頭の中で答えましょう。1. プレイブックとは何ですか。2. プレイブックが idempotent(冪等)であるとはどういうことですか。3. ansible.builtin.file のようなタスクの名前は何を表しますか。この3つは「Ansible の基礎」ラボで学びました。

はじめる前に

メモ

このレッスンの上のバーにある ラボを開始 を押します。このラボは、Ansible が入った、あなた専用の Ubuntu マシン まるごとなので、コンテナより起動に少し時間がかかります。各 実行 ボタンは、そのコマンドをマシンのターミナルに、同じセッションで順番に入力します。マシンがまだ起動中と表示されたら、数秒待ってからもう一度押します。様子を見たり自分で入力したりするには、バーの ターミナルを開く を押します。

ロールは決まった構造のフォルダーである

ansible-galaxy role init は空のロールのフォルダーを作ります。ネットワークがなくても動きます。ここでは、ラボではなく /tmp に hello というロールを作ります。一覧にフォルダーが表示されます。tasks にはロールの動作、defaults と vars には変数が入ります。templates と files にはコピーするもの、handlers には指示を待つタスク、meta には作った人の情報が入ります。tests と README.md はおまけです。

コマンド
ansible-galaxy role init --init-path /tmp/demo-roles hello

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

コマンド
ls /tmp/demo-roles/hello

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

チェック

ヒント

プレイブックから変えられるようにしたい値は、ロールのどこに置きますか。答え: defaults です。変数にとって最も弱い場所です。誰も変えてはいけない値は vars に置きます。

同じ名前で値が2つ:1つが勝つ

変数はいろいろな場所で決められ、順番によって勝つものが決まります。ロールの defaults は、ほとんどすべてに負けます。プレイの vars はそれに勝ち、ロール自身の vars はプレイに勝ち、コマンドラインの -e で渡した値はすべてに勝ちます。/tmp に書くこのプレイブックは、プレイで colour を blue にし、ファイルを作ってハンドラーに知らせるタスクを2つ持ちます。実行し、次に -e colour=red を付けてもう一度実行します。ファイルは毎回 touch されるので、recap はどちらも changed=2 になり、表示される色が順番のとおりに変わります。

コマンド
printf -- '- hosts: web1\n  gather_facts: false\n  vars:\n    colour: blue\n  tasks:\n    - ansible.builtin.debug:\n        var: colour\n    - ansible.builtin.file:\n        path: /tmp/demo-a\n        state: touch\n      notify: Say hello\n    - ansible.builtin.file:\n        path: /tmp/demo-b\n        state: touch\n      notify: Say hello\n  handlers:\n    - name: Say hello\n      ansible.builtin.debug:\n        msg: hello\n' > /tmp/demo.yml

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

コマンド
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.yml

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

コマンド
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.yml -e colour=red

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

チェック

ヒント

色が red になったのはなぜですか。答え: -e で渡した値は優先順位が最も高いので、プレイの vars に勝つからです。

よくある間違い

注意

ハンドラーは、タスクが頼むたびに実行されると思っている人が多くいます。ハンドラーはプレイの最後まで待ち、頼んだタスクがいくつあっても1回だけ実行されます。しかも、そのうち1つが本当に何かを変えたときだけです。何も変わらなければ、まったく実行されません。

ハンドラーは、何度頼まれても1回だけ実行される

プレイブックでは、2つのタスクが notify: Say hello と書いています。出力には changed のタスクが2つあり、RUNNING HANDLER の行は1つだけです。このコマンドはプレイブックをもう一度実行し、RUNNING を含む行だけを残します。行は1つです。Ansible は、待っているハンドラーをプレイの途中で実行することもできます。flush_handlers というタスクを使い、あとのタスクがハンドラーの仕事を必要とするときにロールが使います。

コマンド
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.yml | grep RUNNING

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

チェック

ヒント

3つのタスクが何かを変え、すべて同じハンドラーに知らせます。ハンドラーは何回実行されますか。答え: プレイの最後に1回です。途中で flush_handlers により先に実行された場合は別です。

Vault は値を暗号化したまま保つ

ansible-vault encrypt_string は、パスワードで1つの値を暗号化します。パスワードはファイルに入れます。このラボには練習用の偽のパスワード vault-password.txt があります。表示されるのは demo_var: !vault | で始まり、そのあとにヘッダー $ANSIBLE_VAULT;1.1;AES256 が続き、残りは読めません。このブロックは変数ファイルに入れられます。ファイルまるごとを ansible-vault create や encrypt で暗号化することもでき、view でもう一度見られます。

コマンド
ansible-vault encrypt_string --vault-password-file ~/roles-lab/vault-password.txt demo --name demo_var

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

最後のチェック

ヒント

見返さずに答えましょう。1. ロールのどのフォルダーにタスクが入りますか。2. defaults の変数と -e で渡した変数では、どちらが勝ちますか。3. 2つのタスクが知らせたハンドラーは何回実行されますか。4. ファイルの先頭の $ANSIBLE_VAULT は何を表しますか。答え: tasks、-e で渡した変数、1回、暗号化されていること。では、ラボに取り組みましょう。ターミナルで cat README.md を実行し、ホームフォルダーの README.md を読みます。

先生へ

ヒント

このレッスンは、ラボで進めるレッスンの小さな例です。ステップと実行ボタンがレッスンで、ラボは生徒それぞれのコピーです。VM ラボで行い、生徒はそれぞれ Ansible の入った自分の Ubuntu マシンを持ちます。実行ボタンはそのターミナルに入力して、表示された結果を見せます。学習のポイント:1. ロールは、決まったフォルダーに分けたプレイブックである。2. 同じ名前の変数が2つあるときは優先順位が決め、-e が最も強い。3. ハンドラーは、何個のタスクが知らせても最後に1回だけ実行される。4. Vault は値やファイルを暗号化し、パスワードは別に保管する。よくある間違い:ハンドラーは知らせるたびに実行されると思うこと。準備するもの:ラボとブラウザー。ヒント:2回目の実行の前に、どの色が表示されるかとその理由をクラスに尋ねましょう。ラボ自体には、ロールを実行して作られたファイルを採点するチェックがあります。レッスンは自分のモジュールにコピーして変更するか、レッスンビルダーの ラボ メニューでゼロから作れます。

このラボとソースについて: Ansible ロールのラボ:ロール、ハンドラー、Vault を1台の Ubuntu VM で

授業で教えていますか?これらのレッスンを生徒に割り当て、採点と生徒ごとのラボを使えます。