Solist Work Blog

List of all blog posts

Ansibleのhandlersで複数の処理をする

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/Debian.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

ansibleを実行している画面

ansible2.2 で問題なく動きました