読者です 読者をやめる 読者になる 読者になる

ksaitoの日記

日々試したことの覚え書き

systemdのサービスをansible-playbookのhandlersでうまく記述する方法

ansible-playbookのhandlersでserviceを使ってサービスをリスタート出来ますが、systemdのサービスを再起動しようとしてもエラーになります。

systemdは、設定変更時にsystemctl daemin-reloadを実行してからサービスを再起動する必要があるためです。

下記の例は、systemdで起動するdocker daemonの例です。

handlersに、shellを使ってsystemctl daemin-reloadするハンドラとserviceを使ってリスタートするハンドラを定義します。

notifyで、2つのハンドラを順番に呼び出すことで正しくサービスを再起動してくれます。

tasks:
    - block:
        - name: create docker daemon systemd directory
          file:
            path: "/etc/systemd/system/docker.service.d"
            state: directory
            owner: root
            group: root
            mode: "u=rwx,g=rx,o=rx"
        - name: setup docker daemon proxy
          template:
            src: "{{ item }}.j2"
            dest: "/etc/systemd/system/docker.service.d/{{ item }}"
            owner: root
            group: root
            mode: "u=rw,g=r,o=r"
          notify:
            - daemon reload
            - restart docker
          with_items:
            - 50-http-proxy.conf
      when: http_proxy != ""

  handlers:
    - name: daemon reload
      shell: systemctl daemon-reload
    - name: restart docker
      service: name=docker state=restarted