Solist Work Blog

Software engineer note

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でrestart_tasks.ymlをincludeして restart_tasks.ymlで複数の処理を書けばうまく処理できます。

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 で問題なく動きました

タグ一覧

お仕事のご相談などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ