ansible-playbook でタグ指定でロールの一部を実行したときだけハンドラを実行しない


例えば次のようなプイレブックで、

# site.yaml

- hosts: all
  roles:
    - { role: hoge, tags: hoge }

hoge ロールの tasks と handlers が次の通り。

# roles/hoge/tasks/main.yaml

- name: hoge config file
  copy:
    src: hoge.conf
    dest: /tmp/hoge.conf
  notify:
    - hoge restart

- name: hoge service start
  systemd:
    name: hoge.service
    state: started
    enabled: yes
# roles/hoge/handlers/main.yaml

- name: hoge restart
  systemd:
    name: hoge.service
    state: restarted

このとき、hoge config file だけ実行したいけど changed でもハンドラは実行したくない、ということがたまにあります。

単に hoge config file にタグを付けるだけだとハンドラが実行されてしまうので、タグ指定したときにハンドラが実行されないようにする小ネタ。


hoge config file にそれっぽいタグを付けて、

- name: hoge config file
  copy:
    src: hoge.conf
    dest: /tmp/hoge.conf
  notify:
    - hoge restart
  tags:
    - hoge_config # <--

hoge service start でそれぽぽい変数を登録します。

- name: hoge service start
  systemd:
    name: hoge.service
    state: started
    enabled: yes
  register: hoge_service # <--

その変数を条件にハンドラを実行します。

- name: hoge restart
  systemd:
    name: hoge.service
    state: restarted
  when: hoge_service is defined # <--

タグ hoge を指定して実行すれば hoge service start によって hoge_service が登録されるので hoge config filechanged ならハンドラが実行されます。

タグ hoge_config を指定して実行すれば hoge config filechanged のときにハンドラが実行されようとしますが、hoge service start が実行されないので hoge_service が未定義になるためハンドラは実行されません。