Ansible

Ansible | インベントリとPlaybookとRoleの関係 ( Roleの基本と動作例 )

インベントリとPlaybookとRoleの関係は?

  • Playbook が「対象のホスト」をインベントリから得る
  • Playbook は「実際の動作部分」をRoleに委ねる
  • Playbookは、MVCでいうコントローラーのようなイメージに近いかもしれない

何が良いの?

  • 実行対象 ( インベントリ )
  • 動作 ( Role )
  • 「実行対象」と「動作」の組み合わせ ( Playbook )

このそれぞれをパーツ化することによって、柔軟に一連の処理を作ることが出来る。

image.png

  • 仮にインベントリが存在しなかったら、Playbookに長大な対象ホストを書かなければいけない。
  • 仮にRoleが存在しなかったら、複数のPlaybook同士で重複する処理があっても、共通化することが出来ない。

動作例

インベントリファイル

おなじみのインベントリファイルで、対象のホストをグループ化しておく。

inventory.txt
[example]
0.0.0.0
0.0.0.1

Playbook

ここではPlaybookには直接タスクを書かず、Roleに処理を任せるようにする。

この例では「 example グループに対して touch_file というRoleを実行する」ということを Playbook で指定する。

playbook.yml
---
- hosts: example
  roles:
    - touch_file

Role

実際の「動作部分」を受け持つ Roleを1個作ってみる。
ここでは簡潔に、ファイル作成だけをおこなわせる。

roles/touch_file/tasks/main.yml
- name: touch file
  shell: touch example.txt

ファイル階層は次のとおりにする。

roles/ロール名/tasks/main.yml

実行

インベントリとPlaybookを指定して ansible-playbook コマンドを実効する。
このやり方はRoleを使う場合でも、使わない場合でも変わらない。

ansible-playbook -i inventory.txt playbook.yml

間違えの例

tasks/main.yml に記述している以上、タスクであることは自明なので、YAMLのキーに tasks: と書く必要はない。

roles/touch_file/tasks/main.yml
tasks:
  - name: touch file
    shell: touch example.txt

ちなみに

Role には tasks 以外にも色々な要素を定義出来るが、ここでは無視して tasks だけを作った。
他のものはなくても動作する。

tasks/
handlers/
files/
templates/
vars/
defaults/
meta/

参考