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

無料レッスン

Ansibleのロールと変数の優先順位

このレッスンのあとで: ロールの構成を説明し、同じ名前の変数のどれが勝つかを言える。

60分のレッスンコマンド11件Ansible ロールのラボ:ロール、ハンドラー、Vault を1台の Ubuntu VM で

同じ名前の変数が2つあるとき

Ansible のロールとは、プレイブックを決まったフォルダに分けて、使い回せるようにしたものです。同じ名前の変数が複数の場所にあるときは、変数の優先順位が、どの値を使うかを決めます。

3つの情報教室を同じ設定にしたいが、教室ごとに保存日数だけは変えたい、という場面を考えます。どこに書けば変えられ、どこに書けば変えられないかを、知っておく必要があります。

このレッスンのゴール

メモ

ロールの構成を説明し、同じ名前の変数のどれが勝つかを言える。

重要な言葉

ことばいみれい
プレイブックAnsible にさせる作業を、順に書いたファイルplay.yml
ロールプレイブックを決まったフォルダに分けた、使い回せる部品
タスクモジュールを1回呼ぶ、作業ひとつ分
defaultsロールの変数のうち、いちばん弱い置き場defaults/main.yml
優先順位同じ名前の変数で、どの値が勝つかの順番
-e実行のときに変数を渡す指定。extra vars とも言う-e who=Ada

学生が入力するセルは、このプレビューでは空白です。

ロールは決まったフォルダの集まり

ロールは、名前のついたフォルダです。その中のフォルダ名は決まっていて、Ansible が自動で読みます。

作業は tasks、弱い変数は defaults、強い変数は vars に書きます。ファイルのひな形は templates、コピーするファイルは files、あとで呼ばれる作業は handlers、作者などは meta です。

ロールのフォルダと入れるもの

フォルダ入れるもの
tasks実行する作業(main.yml が入口)
defaults変えてよい値の既定値
varsロールが固定したい値
templates変数を埋め込むひな形
handlers変更があったときだけ動く作業
meta作者や説明

学生が入力するセルは、このプレビューでは空白です。

自分のフォルダを作る

コマンド
mkdir ~/notes

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

そのフォルダに入る

コマンド
cd ~/notes

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

空のロールを作る

コマンド
ansible-galaxy role init --init-path roles greet

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

ロールの中を見る

コマンド
LC_ALL=C ls -1 roles/greet

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

同じ名前なら、強い置き場が勝つ

変数は、たくさんの場所に書けます。同じ名前が2か所にあると、強い場所の値が使われます。

ここでは4つを覚えます。弱い順に、ロールの defaults、プレイの vars、ロールの vars、実行時の -e です。実際はもっとありますが、この4つで多くの場面が説明できます。

弱い順に並べた4つの置き場

強さ置き場書く場所
1 弱いロールの defaultsroles/greet/defaults/main.yml
2プレイの varsプレイブックの vars:
3ロールの varsroles/greet/vars/main.yml
4 強い-e命令の -e 名前=値

学生が入力するセルは、このプレビューでは空白です。

defaultsに値を書く

コマンド
printf '%s\n' 'who: from-defaults' > roles/greet/defaults/main.yml

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

値を画面に出すタスクを書く

コマンド
printf '%s\n' '- ansible.builtin.debug:' '    msg: "{{ who }}"' > roles/greet/tasks/main.yml

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

プレイにも同じ名前の変数を書く

コマンド
printf '%s\n' '- hosts: localhost' '  gather_facts: false' '  vars:' '    who: from-play' '  roles:' '    - greet' > play.yml

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

実行して、勝つ値を見る

コマンド
ansible-playbook -i localhost, -c local play.yml | grep msg

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

ロールのvarsにも書く

コマンド
printf '%s\n' 'who: from-role-vars' > roles/greet/vars/main.yml

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

もう一度実行する

コマンド
ansible-playbook -i localhost, -c local play.yml | grep msg

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

-eで値を渡して実行する

コマンド
ansible-playbook -i localhost, -c local play.yml -e who=from-command-line | grep msg

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

よくある間違い

注意

自分に近いプレイの vars が、ロールの vars に勝つと思いがちです。実際は、ロールの vars のほうが強いです。ロールが固定したい値だけを vars に、利用者が変えてよい値は defaults に書いてください。

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

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