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回目の実行の前に、どの色が表示されるかとその理由をクラスに尋ねましょう。ラボ自体には、ロールを実行して作られたファイルを採点するチェックがあります。レッスンは自分のモジュールにコピーして変更するか、レッスンビルダーの ラボ メニューでゼロから作れます。