コンテンツにスキップ

Ansible roles / importrole / includerole 実務リファレンス

この記事について

Ansibleのroles:import_roleinclude_roleの使い分けに迷うエンジニア向けの実務リファレンスです。

この記事で得られること:

  1. フローチャートで3つの手段を即座に判断できる
  2. 逆引き表で「やりたいこと」から適切な手段を選べる
  3. トラブル時に事故逆引き表で原因と対応を特定できる

このドキュメントの使い方


意思決定フローチャート

Playの骨格としてロールを並べるだけ?
│
├─ Yes ───────────────────────────→ roles:
│
└─ No → 途中にタスクを挟む必要がある?
         │
         ├─ No ───────────────────→ roles:
         │
         └─ Yes → 条件分岐/ループ/可変ロール名が必要?
                   │
                   ├─ No ─────────→ import_role
                   │                 (静的・タグがロール内に効く)
                   │
                   └─ Yes ────────→ include_role
                                     (動的・条件/ループに強い)
                                     │
                                     └─ タグ等をロール内に効かせたい?
                                         ├─ Yes → apply: 併用
                                         └─ No  → そのまま

逆引き表(やりたいこと → 手段)

やりたいこと使う手段注意点
Playの骨格として並べるroles:最優先。依存解決も自動
途中にタスクを挟むimport_role位置を明示できる
タグをロール内全タスクに効かせるimport_roleinclude_roleはapply:必要
条件分岐でロール選択include_rolewhen:と組み合わせ
ループでロール呼び出しinclude_roleloop:と組み合わせ
可変ロール名(変数で指定)include_rolename: "{{ var }}"
ロール内の特定ファイルだけ実行tasks_from:入口は少数に限定
ロール変数を後続タスクへ公開include_role + public: true明示必須
同一ロールを複数回実行allow_duplicates: true(ロール側)meta/main.ymlに記載

事故逆引き表(症状 → 対処)

症状原因対処
タグ指定したのにロール内が動かないinclude_roleのタグはロール内に継承されないapply:を使う or import_roleに変更
同じロールの2回目がスキップ重複排除(デフォルト)ロール側にallow_duplicates: true
変数が前段タスクにも影響import_roleは解析時に露出public明示+共有変数は専用ロール化
ハンドラ内でroleが動かないhandlers内でのrole呼び出しは不可handlerは単機能に限定、role呼び出しはtasksへ
handler名衝突で別のが動くhandlersはPlay全体スコープrole_name : handler_name形式でnotify

3つの手段の性格

静的 vs 動的

種別展開タイミング特徴
静的 (roles:, import_role)解析時(parse)実行計画が早期に確定。タグ等がロール内に効きやすい
動的 (include_role)実行時(runtime)条件分岐/ループに強い。タグ等はapply:で明示

各手段の概要

手段用途性格
roles:Playの骨格静的。依存解決も自動。tasksより前に走る
import_role途中に挟む+タグを効かせたい静的。tasks列に配置可能
include_role条件分岐/ループ/可変ロール名動的。柔軟だがタグはapply:必要

実行順

roles: で指定したロール  ←── 先に実行
        ↓
tasks: のタスク列(import_role/include_roleはここに挿入される)
  • roles:はtasksより前段で走る
  • import_role/include_roleはtasks列の書いた位置で実行

タグの効き方(最重要の差分)

手段タグの効き先対処
roles: / import_roleロール内全タスクに適用そのまま使える
include_roleinclude_role文自体にのみapply:でロール内に通す

include_role + apply 例:

- name: deploy with tags
  ansible.builtin.include_role:
    name: app
    apply:
      tags: [deploy]
      become: true
  tags: [deploy]  # ← この行はinclude_role文へのタグ

特定ファイルだけ呼ぶ(tasks_from等)

- ansible.builtin.include_role:
    name: myrole
    tasks_from: setup.yml      # roles/myrole/tasks/setup.yml
    handlers_from: custom.yml  # roles/myrole/handlers/custom.yml

実務ルール: 入口は少数(install/configure/verify程度)に限定。増えたらロール分割を検討。


変数スコープと public

手段public指定時の露出範囲
include_roleそのタスク以降で参照可能
import_role解析時に公開(前段にも影響しうる)
- ansible.builtin.include_role:
    name: shared_vars
    public: true  # ← 明示が必須

チーム標準: publicは常に明示(true/false)。共有変数は専用ロールに閉じる。


重複排除と allow_duplicates

原則: 同一Play内で同じロールは1回だけ実行(依存ロールも同様)

複数回実行したい場合:

# roles/myrole/meta/main.yml
allow_duplicates: true

パターン集

A. Play骨格(デフォルト)

- hosts: all
  roles:
    - common
    - hardening
    - app

B. 途中に検査を挟む

- hosts: web
  tasks:
    - name: precheck
      command: /usr/local/bin/precheck

    - ansible.builtin.import_role:
        name: app
      tags: [deploy]

C. 条件分岐

- hosts: all
  tasks:
    - ansible.builtin.include_role:
        name: app_debian
      when: ansible_facts['os_family'] == 'Debian'

    - ansible.builtin.include_role:
        name: app_rhel
      when: ansible_facts['os_family'] == 'RedHat'

D. ループ

- hosts: all
  tasks:
    - ansible.builtin.include_role:
        name: "{{ item }}"
      loop:
        - common
        - app

E. include_role + apply

- hosts: web
  tasks:
    - ansible.builtin.include_role:
        name: app
        apply:
          tags: [deploy]
          become: true
      tags: [deploy]

チーム標準化(最小ルール)

  1. デフォルトは roles:
  2. 例外条件を明文化
  3. 途中に挟む → import_role
  4. 条件/ループ/可変 → include_role(ロール内に効かせるならapply:
  5. publicは常に明示(true/false)
  6. tasks_fromの入口は少数(増えたらロール分割)
  7. 複数回実行が必要なロールはallow_duplicatesをロール側に
  8. handlerでのrole呼び出しは禁止(設計規約)

参照


更新: 2025-12-29