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 にアップグレードだ!