Ansible: 実行中の場合のみサービスを再起動する

Ansible: 実行中の場合のみサービスを再起動する

Ansibleプレイブックでは、設定ファイルを更新した後にサービスを再起動したいのですが、既に実行中

Ansible を使用してサービスの状態を制御するのではなく、以前に開始された場合にのみ再起動します。

そのためにカスタム コマンドを使用することもできますが、Ansible のサービス モジュールのように、異なるサービス管理システム (upstart/systemd/sysvinit/openrc など) 間で移植することはできません。

何かヒントがあればよろしくお願いします。

答え1

設定が更新されたときに変数を登録します。サービスが実行中かどうかを確認するときに別の変数を登録します。両方の変数が true の場合にのみ、サービス再起動ハンドラーを呼び出します。

さまざまな OS の詳細については、ホストの事実からファミリ/ディストリビューションに基づいて条件付き実行を行うことができます。

答え2

Ansible のservice:モジュールには、サービスがすでに実行されているかどうかを確認するメカニズムが用意されていません。したがって、まずサービスが実行中かどうかを判断するには、モジュール経由で次のようなものを使用する必要がありますshell:

ここでは、WebSphere または Tomcat8 が実行されているかどうかを検出し、そのステータスに基づいて適切なサービスを再起動します。

---
# handles tomcat8
- name: is tomcat8 already running?
  shell: service tomcat8 status warn=false
  register: _svc_tomcat8
  failed_when: _svc_tomcat8.rc != 0 and ("unrecognized service" not in _svc_tomcat8.stderr)
  ignore_errors: true

- name: restart tomcat8 if running
  service: name=tomcat8 state=restarted
  when: "_svc_tomcat8.rc == 0"

# handles WAS
- name: is WebSphere already running?
  shell: service Node01_was.init status warn=false
  register: _svc_websphere
  failed_when: _svc_websphere.rc != 0 and ("unrecognized service" not in _svc_websphere.stderr)
  ignore_errors: true

- name: restart WebSphere if running
  service: name=Node01_was.init state=restarted
  when: "_svc_websphere.rc == 0"

# vim:ft=ansible:

特定のファイルが更新された場合にのみ再起動を呼び出すには、またはタスクregister:で を使用して、ファイルが更新されたかどうかの状態を保存します。 この結果は、タスクの の一部として組み込むことができます。copy:template:register:when:service: name=XXXX state=restarted

答え3

組み込みservice_factsモジュールを使用して、まずサービスの状態を確認できるようになりました。次に、サービスの状態に基づいて条件を追加できます。

これは、他のタスクによって通知されるように設定された私の例です。


- name: check service status
  service_facts:
  listen:
    - restart sidekiq

- name: restart sidekiq
  service:
    name: sidekiq
    state: restarted
  become: yes
  when: ansible_facts.services['sidekiq.service']['state'] == 'running'

関連情報