はじめに
Ansibleでループ(loopやwith_itemsなど)を使用する場合、ループは各タスクごとに記載する必要がある。そのため以下の図のように複数タスクを1つにまとめ、①→②→③→②→③→④の順番に処理を行いたい場合は工夫が必要。
環境
Ansible: 2.14.1
Python: 3.10.6
失敗①
無理だろうなと思いつつ各タスクごとにwith_itemsを記載。
当然ながら、①→②→②→③→③→④の順番で実行される。
playbook.yaml
tasks:
- name: task1
debug:
msg: "start"
- name: task2
debug:
msg: "good morning {{ item }}"
with_items:
- taro
- jiro
- name: task3
debug:
msg: "hello {{ item }}"
with_items:
- taro
- jiro
- name: task4
debug:
msg: "finish"
失敗②
タスク②とタスク③をblockで囲ってみたがエラーが出た。
playbook.yaml
tasks:
- name: task1
debug:
msg: "start"
- name: task2_and_task3
block:
- name: task2
debug:
msg: "good morning {{ item }}"
- name: task3
debug:
msg: "hello {{ item }}"
with_items:
- taro
- jiro
- name: task4
debug:
msg: "finish"
調べたところ、blockでまとめたタスクをループさせることはできないらしい。
解決策
ループさせたいタスクを別のplaybookに記載し、include_tasksで呼び出すことで解決。
playbook.yaml
tasks:
- name: task1
debug:
msg: "good morning"
- name: task2_and_task3
include_tasks: task2_and_task3.yaml
with_items:
- taro
- jiro
- name: task4
debug:
msg: "finish"
task2_and_task3.yaml
- name: task2
debug: "good morning {{ item }}"
- name: task3
debug: "hello {{ item }}"