ぴよ丸水産

週末ファゴッティストによる技術ブログ

【Ansible】複数taskをまとめてループ

はじめに

Ansibleでwith_itemsを使って、
複数のtaskをまとめてループさせるPlaybookの書き方をメモしておきます。

こんなイメージです。

f:id:blue-38:20191120101443j:plain

動作確認環境

  • Ansible:2.8.5

複数taskをループするPlaybookの書き方

includeを使って、
ループする複数taskを書いたplaybookを呼び出す方法で実現しました。

呼ぶ側のPlaybook

  • site.yml
---
- hosts: all
  tasks:
  - name: call loop tasks
    include: loop.yml
    with_items:
      - "loop01"
      - "loop02"
      - "loop03"

呼ばれる側のPlaybook

  • loop.yml
---
- block:
  - name: called task01
    debug:
      msg: "{{ item }}"

  - name: called task02
    debug:
      msg: "{{ item }}"

  - name: called task03
    debug:
      msg: "{{ item }}"

複数taskはblockでくくって書きます。

1回目のループはitem="loop01"でloop.ymlが実行、
2回目のループはitem="loop02"でloop.ymlが実行、
3回目のループはitem="loop03"でloop.ymlが実行される、
といった感じです。

実行ログ

こんな感じになります。

# ansible-playbook -i "localhost," -c local site.yml

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

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [call loop tasks] *********************************************************
included: /root/work/loop.yml for localhost
included: /root/work/loop.yml for localhost
included: /root/work/loop.yml for localhost

TASK [called task01] ***********************************************************
ok: [localhost] => {
    "msg": "loop01"
}

TASK [called task02] ***********************************************************
ok: [localhost] => {
    "msg": "loop01"
}

TASK [called task03] ***********************************************************
ok: [localhost] => {
    "msg": "loop01"
}

TASK [called task01] ***********************************************************
ok: [localhost] => {
    "msg": "loop02"
}

TASK [called task02] ***********************************************************
ok: [localhost] => {
    "msg": "loop02"
}

TASK [called task03] ***********************************************************
ok: [localhost] => {
    "msg": "loop02"
}

TASK [called task01] ***********************************************************
ok: [localhost] => {
    "msg": "loop03"
}

TASK [called task02] ***********************************************************
ok: [localhost] => {
    "msg": "loop03"
}

TASK [called task03] ***********************************************************
ok: [localhost] => {
    "msg": "loop03"
}

PLAY RECAP *********************************************************************
localhost                  : ok=13   changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

まとめ

  • 呼ぶ側Playbookはinclude: 呼ばれる側Playbookwith_itemsで回す
  • 呼ばれる側Playbookはまとめてループさせたい複数タスクを、blockでくくって記載してあげる
    これで実現できます。