同じ名前の変数が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 弱い | ロールの defaults | roles/greet/defaults/main.yml |
| 2 | プレイの vars | プレイブックの vars: |
| 3 | ロールの vars | roles/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 に書いてください。