ときどきAnsible日記

主にITインフラ基盤の自動化に関する事を書いているブログです

handlersを使ってみる

お疲れ様です。伊藤です。

先ほど挙げた記事が重すぎてトップページがヤバイことになっているので軽めの記事を早々に上げます。
handlersはPlaybookに処理を書いて、その結果がchengedになった場合に実行されるものです。例えば設定ファイルを変えてサービスを再起動したい場合などに使えます。何度も繰り返し実行しても設定ファイルを変更する必要がなければサービスの再起動もされない、という便利な機能です。


プレイブック側にはこんな風に書きます。
roles/common/tasks/main.yml

- name: sshd config
  notify:
    - restart sshd
  copy: src="sshd_config" dest="/etc/ssh/sshd_config" owner=root group=root mode=0600
  tags: sshd

ここでは管理サーバにsshd_configというファイルを置いて、それを管理対象サーバ側の/etc/ssh/sshd_configにコピー、所有者・グループをrootにして権限は600にする、というものです。ポイントはnotify:です。ここにrestart sshdと記載していますがこの内容をhandlersに記述します。つまりnotifyとhandlersはセットになります。


handlers側にはこんな風に記述。
roles/common/handlers/main.yml

---
- name: restart sshd
  service: name=sshd state=restarted

これでsshの設定ファイルが変更されたときのみsshサービスが再起動されます。


早速実行してみましょう。

# ansible-playbook -i development site.yml -u root

PLAY [webservers] *****************************************************************

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

TASK [common : sshd config] *******************************************************
changed: [192.168.1.105]

RUNNING HANDLER [common : restart sshd] *******************************************
changed: [192.168.1.105]

PLAY RECAP ************************************************************************
192.168.1.105              : ok=3    changed=2    unreachable=0    failed=0

RUNNING HANDLERとしてsshの再起動が動いています。もう一度実行してみましょう。

# ansible-playbook -i development site.yml -u root

PLAY [webservers] *****************************************************************

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

TASK [common : sshd config ********************************************************
ok: [192.168.1.105]

PLAY RECAP ************************************************************************
192.168.1.105              : ok=2    changed=0    unreachable=0    failed=0

今度はsshd configがchengedになっていないのでhandlersは動いていません。すでに変更済みのため何もしない、という状況になります。上手く使えばかなり便利になると思います。
今回はcommonのroleで作成していますが、role毎にまとめておけば余計なサービスが再起動する、というようなこともありません。また、サービスの再起動に限らずchengedになったときのみ実行したい機能があればこちらを利用できます。


もうちょっと複雑な使い方(chengedを返す条件を変えたり)もできますが、とりあえず今回は終了です。
お疲れ様でした。