Ansible Documentation
Creating Reusable PlaybooksIncluding and Importing
まとめ
import_tasks: / include_tasks: が記述されている側を親ファイル・親タスク、呼び出されるファイル側を子ファイル・子タスクとします。import_tasks | include_tasks | |
---|---|---|
子タスクが取り込まれるタイミング | 親タスクの実行前 | include_tasks: の実行時 |
子タスクの構文チェックが行われるタイミング | 親タスクと同じタイミング | 子ファイルが呼び出されたとき |
指定したディレクティブ ※ loop ディレクティブは除く | すべての子タスクに継承される | include_tasks: だけに適用され、子タスクに継承されない |
loop ディレクティブ | 指定できない | 指定できる |
子ファイル名の指定に変数を使用 | 使用できない | 使用できる |
--list-tasks: の表示内容 | 親タスク名と子タスク名 ※import_tasks: に指定したタスク名は表示されない | 親タスク名 ※imclude_tasks: に指定したタスク名は表示される |
--start-at-task で指定できるタスク名 | 親タスク名と子タスク名 | 親タスク名のみ |
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: resultansible-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$