import_tasks と include_tasks の違い

2019/06/02

Ansible

 Ansible Documentation

Creating Reusable Playbooks
Including and Importing

 まとめ

 import_tasks: / include_tasks: が記述されている側を親ファイル・親タスク、呼び出されるファイル側を子ファイル・子タスクとします。
 import_tasksinclude_tasks
子タスクが取り込まれるタイミング親タスクの実行前include_tasks: の実行時
子タスクの構文チェックが行われるタイミング親タスクと同じタイミング子ファイルが呼び出されたとき
指定したディレクティブ
※ loop ディレクティブは除く
すべての子タスクに継承されるinclude_tasks: だけに適用され、子タスクに継承されない
loop ディレクティブ指定できない指定できる
子ファイル名の指定に変数を使用使用できない使用できる
--list-tasks: の表示内容親タスク名と子タスク名
※import_tasks: に指定したタスク名は表示されない
親タスク名
※imclude_tasks: に指定したタスク名は表示される
--start-at-task で指定できるタスク名親タスク名と子タスク名親タスク名のみ
実際に play を動かしながら見ていきます。実行対象ホストは nocd-c0706(CentOS7.6)と node-u1804(Ubuntu18.04)です。

 import_tasks

親ファイルの内容です。
---
- hosts: all

  tasks:
    - name: 取り込み前
      debug:
        msg: "前"
    - name: タスクの取り込み
      import_tasks: sample.yml
      when: ansible_facts['distribution'] == "CentOS"
    - name: 取り込み後
      debug:
        msg: "後"
子ファイルの内容です。
- name: ホスト名の取得
  shell: hostname
  register: result
- name: ホスト名の表示
  debug:
    var: result.stdout
- name: 対象ホストに ping
  ping:
  register: result
- name: ping の結果を表示
  debug:
    var: result
ansible-playbook コマンドを実行すると、先ず親ファイル内の import_tasks: モジュールで指定した子ファイルの内容が取り込まれます。このとき when ディレクティブなどがあると、すべての子タスクに継承されます。子ファイルの内容を取り込んだ後の play は次のようなイメージになります。
---
- hosts: all

  tasks:
    - name: 取り込み前
      debug:
        msg: "前"
    - name: ホスト名の取得
      shell: hostname
      register: result
      when: ansible_facts['distribution'] == "CentOS"
    - name: ホスト名の表示
      debug:
        var: result.stdout
      when: ansible_facts['distribution'] == "CentOS"
    - name: 対象ホストに ping
      ping:
      register: result
      when: ansible_facts['distribution'] == "CentOS"
    - name: ping の結果を表示
      debug:
        var: result
      when: ansible_facts['distribution'] == "CentOS"
    - name: 取り込み後
      debug:
        msg: "後"
実行結果です。import_tasks: に name: ディレクティブで指定したタスク名「タスクの取り込み」は表示されません。すべての子タスクに import_tasks: に設定した when: ansible_facts['distribution'] == "CentOS" が継承されているので、node-u1804 が子タスクを実行した結果はすべて skipping: [node-u1804] になっています。
ansibleman@ubuntu-pc:~/ansible/imp-inc$ ansible-playbook -i hosts.yml site.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [node-c0706]
ok: [node-u1804]

TASK [取り込み前] *********************************************************************************************************************
ok: [node-c0706] => {
    "msg": "前"
}
ok: [node-u1804] => {
    "msg": "前"
}

TASK [ホスト名の取得] *******************************************************************************************************************
skipping: [node-u1804]
changed: [node-c0706]

TASK [ホスト名の表示] *******************************************************************************************************************
ok: [node-c0706] => {
    "result.stdout": "node-c0706.exam.local"
}
skipping: [node-u1804]

TASK [対象ホストに ping] ***************************************************************************************************************
skipping: [node-u1804]
ok: [node-c0706]

TASK [ping の結果を表示] ***************************************************************************************************************
ok: [node-c0706] => {
    "result": {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
}
skipping: [node-u1804]

TASK [取り込み後] *********************************************************************************************************************
ok: [node-c0706] => {
    "msg": "後"
}
ok: [node-u1804] => {
    "msg": "後"
}

PLAY RECAP ***********************************************************************************************************************
node-c0706                 : ok=7    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node-u1804                 : ok=3    changed=0    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/imp-inc$
 --list-tasks の実行結果です。子ファイルの取り込み後にタスクリストを生成するので、子タスクのタスク名も表示されています。import_tasks: のタスク名は表示されていません。
ansibleman@ubuntu-pc:~/ansible/imp-inc$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: []
    tasks:
      取り込み前 TAGS: []
      ホスト名の取得 TAGS: []
      ホスト名の表示 TAGS: []
      対象ホストに ping TAGS: []
      ping の結果を表示 TAGS: []
      取り込み後 TAGS: []
ansibleman@ubuntu-pc:~/ansible/imp-inc$
子タスク名を指定して play の途中から実行した結果です。
ansibleman@ubuntu-pc:~/ansible/imp-inc$ ansible-playbook -i hosts.yml --start-at-task "対象ホストに ping" site.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [node-c0706]
ok: [node-u1804]

TASK [対象ホストに ping] ***************************************************************************************************************
skipping: [node-u1804]
ok: [node-c0706]

TASK [ping の結果を表示] ***************************************************************************************************************
ok: [node-c0706] => {
    "result": {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
}
skipping: [node-u1804]

TASK [取り込み後] *********************************************************************************************************************
ok: [node-c0706] => {
    "msg": "後"
}
ok: [node-u1804] => {
    "msg": "後"
}

PLAY RECAP ***********************************************************************************************************************
node-c0706                 : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node-u1804                 : ok=2    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/imp-inc$

 include_tasks

親ファイルの内容です。
---
- hosts: all

  tasks:
    - name: 取り込み前
      debug:
        msg: "前"
    - name: タスクの取り込み
      include_tasks: sample.yml
      when: ansible_facts['distribution'] == "CentOS"
    - name: 取り込み後
      debug:
        msg: "後"
子ファイルの内容です
- name: ホスト名の取得
  shell: hostname
  register: result
- name: ホスト名の表示
  debug:
    var: result.stdout
- name: 対象ホストに ping
  ping:
  register: result
- name: ping の結果を表示
  debug:
    var: result
実行結果です。最初から順番に実行しています。include_tasks: のタスク「タスクの取り込み」を実行し、子ファイルを取り込んでいることがわかります。子タスクの実行結果は node-c0706 だけで、node-u1804 は実行されていません。
ansibleman@ubuntu-pc:~/ansible/imp-inc$ ansible-playbook -i hosts.yml site.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [node-c0706]
ok: [node-u1804]

TASK [取り込み前] *********************************************************************************************************************
ok: [node-c0706] => {
    "msg": "前"
}
ok: [node-u1804] => {
    "msg": "前"
}

TASK [タスクの取り込み] ******************************************************************************************************************
skipping: [node-u1804]
included: /home/ansibleman/ansible/imp-inc/sample.yml for node-c0706

TASK [ホスト名の取得] *******************************************************************************************************************
changed: [node-c0706]

TASK [ホスト名の表示] *******************************************************************************************************************
ok: [node-c0706] => {
    "result.stdout": "node-c0706.exam.local"
}

TASK [対象ホストに ping] ***************************************************************************************************************
ok: [node-c0706]

TASK [ping の結果を表示] ***************************************************************************************************************
ok: [node-c0706] => {
    "result": {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
}

TASK [取り込み後] *********************************************************************************************************************
ok: [node-c0706] => {
    "msg": "後"
}
ok: [node-u1804] => {
    "msg": "後"
}

PLAY RECAP ***********************************************************************************************************************
node-c0706                 : ok=8    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node-u1804                 : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/imp-inc$
 --list-tasks の実行結果です。include_tasks: を実行して子ファイルを取り込むので include_tasks: のタスク名は表示されますが、タスクリストに子タスク名は表示されません。
ansibleman@ubuntu-pc:~/ansible/imp-inc$ ansible-playbook -i hosts.yml --list-tasks site.yml

playbook: site.yml

  play #1 (all): all TAGS: []
    tasks:
      取り込み前 TAGS: []
      タスクの取り込み TAGS: []
      取り込み後 TAGS: []
ansibleman@ubuntu-pc:~/ansible/imp-inc$
 --start-at-task で指定できるタスク名は --list-tasks で表示できるものなので、子タスクの指定はできません。親タスク名だけが指定可能です。
ansibleman@ubuntu-pc:~/ansible/imp-inc$ ansible-playbook -i hosts.yml --start-at-task "取り込み後" site.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [node-c0706]
ok: [node-u1804]

TASK [取り込み後] *********************************************************************************************************************
ok: [node-c0706] => {
    "msg": "後"
}
ok: [node-u1804] => {
    "msg": "後"
}

PLAY RECAP ***********************************************************************************************************************
node-c0706                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node-u1804                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/imp-inc$

 loop ディレクティブ

 include_tasks: だけ loop ディレクティブを指定できます。~/users.csv を読み込みアカウントを登録する例です。
読み込む ~/users.csv ファイルです。
name,uid
dag,500
jeroen,501
親ファイルの内容です。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 対象者の読み込み
      read_csv:
        path: ~/users.csv
      register: users
      delegate_to: localhost
    - name: アカウント登録モジュールの取り込み
      include_tasks: users.yml
      loop:
        "{{ users.list }}"
子ファイルの内容です
- name: アカウント登録
  user:
    name: "{{ item.name }}"
    uid: "{{ item.uid }}"
    state: present
  become: yes
- name: 登録したアカウント名を表示
  debug:
    var: item.name
実行結果です。~/users.csv ファイルに登録された件数(2 件)分だけ子タスク「アカウント登録」と「登録したアカウント名を表示」が実行されていることが確認できます。
ansibleman@ubuntu-pc:~/ansible/imp-inc$ ansible-playbook -i hosts.yml site.yml

PLAY [all] ***********************************************************************************************************************

TASK [対象者の読み込み] ******************************************************************************************************************
ok: [node-c0706]
ok: [node-u1804]

TASK [アカウント登録モジュールの取り込み] *********************************************************************************************************
included: /home/ansibleman/ansible/imp-inc/users.yml for node-c0706, node-u1804
included: /home/ansibleman/ansible/imp-inc/users.yml for node-c0706, node-u1804

TASK [アカウント登録] *******************************************************************************************************************
changed: [node-c0706]
changed: [node-u1804]

TASK [登録したアカウント名を表示] *************************************************************************************************************
ok: [node-c0706] => {
    "item.name": "dag"
}
ok: [node-u1804] => {
    "item.name": "dag"
}

TASK [アカウント登録] *******************************************************************************************************************
changed: [node-c0706]
changed: [node-u1804]

TASK [登録したアカウント名を表示] *************************************************************************************************************
ok: [node-c0706] => {
    "item.name": "jeroen"
}
ok: [node-u1804] => {
    "item.name": "jeroen"
}

PLAY RECAP ***********************************************************************************************************************
node-c0706                 : ok=7    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node-u1804                 : ok=7    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
ansibleman@ubuntu-pc:~/ansible/imp-inc$ 

 変数を使用した子ファイルの指定

 include_tasks: だけ子ファイル名の指定に変数を使用できます。対象ホストのディストリビューションごとに取り込む子ファイルを変更する例です。
親ファイルの内容です。
---
- hosts: all

  tasks:
    - name: ディストリビューションごとに呼び出すファイルを変更する
      include_tasks: "{{ ansible_facts['distribution'] }}.yml"
子ファイル:CentOS.yml の内容です。
- name: CentOS のときの処理
  debug:
    msg: "CentOS です。"
子ファイル:Ubuntu.yml の内容です。
- name: Ubuntu のときの処理
  debug:
    msg: "Ubuntu です。"
実行結果です。タスク「ディストリビューションごとに呼び出すファイルを変更する」の結果を見ると、対象ホストごと(ディストリビューションごと)に別々の子ファイルを取り込んでいることが確認できます。
ansibleman@ubuntu-pc:~/ansible/imp-inc$ ansible-playbook -i hosts.yml site.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [node-c0706]
ok: [node-u1804]

TASK [ディストリビューションごとに呼び出すファイルを変更する] ***********************************************************************************************
included: /home/ansibleman/ansible/imp-inc/CentOS.yml for node-c0706
included: /home/ansibleman/ansible/imp-inc/Ubuntu.yml for node-u1804

TASK [CentOS のときの処理] *************************************************************************************************************
ok: [node-c0706] => {
    "msg": "CentOS です。"
}

TASK [Ubuntu のときの処理] *************************************************************************************************************
ok: [node-u1804] => {
    "msg": "Ubuntu です。"
}

PLAY RECAP ***********************************************************************************************************************
node-c0706                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node-u1804                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/imp-inc$ 

カテゴリー

目次

QooQ