ansible2.4以降スクリプト(playbook, role, task)を再利用する方法がinclude一択から
importとincludeに分かれました。
importとincludeの違い
ドキュメントを訳すると
- import*文(import_tasks, import_role, import_playbook)はスクリプトが実行される前にパースされます。
- include*文はスクリプトの実行時でパースされ、したがって動的に変数を渡せます。
動的タスクincludeする時の問題
今まではinclude文しか使えません。ansible2.4対応で動的にタスクをincludeするとエラーが発生しました。例えばimportantという名のroleがあり、playbook.ymlの中このroleをincludeしています。このroleの中動的にタスクをincludeしてあります。
before:
roles/important/tasks/main.yml
...
- include: other_tasks.yml
var1: password
...
after_ver1:
include*文をそのまま代入します
roles/important/tasks/main.yml
...
- include_tasks: other_tasks.yml
var1: password
...
変更したあと
ansible-playbook playbook.yml
を実行すると
fatal: [myhost.com]: FAILED! => {"reason": "Unable to retrieve file contents\nCould not find or access '/working/dir/other_tasks.yml'"}
エラーが出ます。理由はincludeする時ansibleがplaybookのあるdirでother_tasks.ymlを探しています。でもこのymlはrole/importance/task/にあるので、見つからずエラーで終了しました。直すとすると
after_ver2
roles/important/tasks/main.yml
...
- include_role:
name: importance
tasks_from: other_tasks.yml
vars:
var1: password
...
解説:まず動的にroleをincludeし、実行するタスクが入ってるymlをtasks_fromで指定します。無事role/importance/task/のdirでother_tasks.ymlを見つけました!