日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

ansible で systemd 配下のサービスを扱う

ansible で管理する systemd サービス

ubuntu 16.04 になってから、サービス管理は systemd に変わって、ansible の service モジュールだけでは管理できなくなりました。

どう書けばいいのか忘れがちなので備忘的に記事を残します。

ansible 2.1 以前

uWSGI の設定ファイルを配置して systemd 上で有効化、起動する流れ。

---
- name: systemd daemon-reload
  command: systemctl daemon-reload
  become: yes

- name: enable uwsgi
  command: systemctl enable emperor.uwsgi.service
  become: yes

- name: restart uWSGI
  service:
    name=emperor.uwsgi.service
    state=restarted
  become: yes

設定ファイルを配置したときに、 daemon-reload をしないと新たに配置した設定ファイルが systemd に認識されません。でも、 ansible 2.1 には操作するためのモジュールが無いため、command モジュールで直接実行してます。

続いて、サービスの有効化(再起動時に自動的に起動する)も、操作するモジュールが無いため、command モジュールで設定を行います。

最後に service モジュールを使ってサービスを起動してます。(厳密には restarted を指定してます)ちなみに service モジュールに enabled 属性を設定してサービスを有効化することはできません。 自分は見事に気付かずにハマりました。

ansible 2.2 以降

ansible 2.2 からは systemd モジュールが追加されてます。

systemd - Manage services. — Ansible Documentation

この systemd モジュールを使うと

- name: restart emperor.uwsgi.service
  systemd:
    name: emperor.uwsgi.service
    state: restarted
    daemon_reload: yes
    enabled: yes
  become: yes

1つのタスクにまとまります! 簡素に記述出来るのもありますが、daemon-reload や enabled をまとめて設定できて指定漏れを減らしたり、service モジュールで enabled を指定してサーバ再起動後にデーモンが起動しない事故を防げるはずです。

まとめ

さぁ、みんな、いますぐ ansible は 2.2 にアップグレードだ!