masablog

Keep it simple, stupid

Ansible の handlers で複数の処理がしたい

tech

Ansible でお手軽サーバー管理


メールアドレスを追加したい時
ansible の template に新規アドレスを追加しただけで
メールアドレスが増えるようにしたい。
もちろん冪等性を保ったまま。

dovecot は passwd.j2 のファイルにパスワードが追加されたら
dovecot を再起動するだけなので
ansible の handlers を使ってすぐできる

github

roles/dovecot/handlers/main.yml

- name: restart dovecot
  systemd: name=dovecot state=restarted
  become: yes

roles/dovecot/tasks/Archlinux.yml

- name: render dovecot-passwd
  template: src=templates/passwd.j2 dest=/etc/dovecot/passwd
  notify: restart dovecot

こんな感じで notify と handlers を書いておけば roles/dovecot/templates/passwd.j2
が変更された時だけ dovecot を再起動してくれる。
これは handlers で再起動するという一つの処理だけの場合問題ない。

Ansible の handlers で複数の処理がしたい


postfix はメールアドレスが追加された場合 postfix を再起動するだけではすまない。
vmailbox と virtual を postmap して
newaliases して postfix を restart しなければいけない。
だが、困ったことに ansible の handlers には複数の処理が書けない。

ansible の 2.0 くらいから handlers に include:が書けるようになったようなので
いったん handlers で include して
tasks で handlers でする複数の処理を書く
register: result
when: result
で連続実行されるようにしておく

roles/postfix/handlers/main.yml

- name: Restart conditionally
  include: restart_tasks.yml

roles/postfix/tasks/restart_tasks.yml

- name: Restart conditionally step 1
  command: postmap /etc/postfix/vmailbox
  become: yes
  register: result
- name: Restart conditionally step 2
  command: postmap /etc/postfix/virtual
  become: yes
  when: result
- name: Restart conditionally step 3
  command: postalias hash:/etc/aliases
  become: yes
  when: result
- name: Restart conditionally step 4
  command: newaliases
  become: yes
  when: result
- name: Restart conditionally step 5
  systemd: name=postfix state=restarted
  become: yes
  when: result

ansible2.2 で問題なく動いた
ansible の 2 ではバグがあるようだが試していないのでわからない。

8 Mar 2017 #ansible #linux

このエントリーをはてなブックマークに追加