Javaアプリをinit.dデーモンとしてデプロイするためのAnsibleプレイブックがあります。
AnsibleとLinuxの両方の初心者であるため、ホストのステータスに基づいてホストで条件付きでタスクを実行するのに問題があります。
つまり、サービスが既に存在し、他の操作を行う前に停止したい場所で実行しているホストがいくつかあります。そして、まだサービスを持っていない新しいホストがあるかもしれません。したがって、service: name={{service_name}} state=stopped
を単純に使用することはできません。これは、新しいホストでは失敗するためです。
どうすればこれを達成できますか?ここに私が持っているものがあります:
- name: Check if Service Exists
Shell: "if chkconfig --list | grep -q my_service; then echo true; else echo false; fi;"
register: service_exists
# This should only execute on hosts where the service is present
- name: Stop Service
service: name={{service_name}} state=stopped
when: service_exists
register: service_stopped
# This too
- name: Remove Old App Folder
command: rm -rf {{app_target_folder}}
when: service_exists
# This should be executed on all hosts, but only after the service has stopped, if it was present
- name: Unpack App Archive
unarchive: src=../target/{{app_tar_name}} dest=/opt
もちろん、ラッパースクリプトが/etc/init.dに存在するかどうかも確認できます。だから、これは私が終わったものです:
- name: Check if Service Exists
stat: path=/etc/init.d/{{service_name}}
register: service_status
- name: Stop Service
service: name={{service_name}} state=stopped
when: service_status.stat.exists
register: service_stopped
service_facts
モジュール、Ansible 2.5の新機能。
- name: Populate service facts
service_facts:
- debug:
msg: Docker installed!
when: "'docker' in services"
service
コマンドのリターンコードのみを使用するように@Florianの回答を変更しました(これはMint 18.2で機能しました)
- name: Check if Logstash service exist
Shell: service logstash status
register: logstash_status
failed_when: not(logstash_status.rc == 3 or logstash_status.rc == 0)
- name: Check if Logstash service exist
service:
name: logstash
state: stopped
when: logstash_status.rc == 0
「サービス」モジュールが「認識されないサービス」エラーを処理できればいいでしょう。
これは私のアプローチで、initスクリプトをチェックする代わりにservice
コマンドを使用します。
- name: check for Apache
Shell: "service Apache2 status"
register: _svc_Apache
failed_when: >
_svc_Apache.rc != 0 and ("unrecognized service" not in _svc_Apache.stderr)
- name: disable Apache
service: name=Apache2 state=stopped enabled=no
when: "_svc_Apache.rc == 0"
私の数セント。上記と同じアプローチですが、kubernetesの場合
kubleteサービスが実行されているかどうかを確認
- name: "Obtain state of kublet service"
command: systemctl status kubelet.service
register: kubelet_status
failed_when: kubelet_status.rc > 3
kubletサービスが実行されていない場合にデバッグメッセージを表示する
- debug:
msg: "{{ kubelet_status.stdout }}"
when: "'running' not in kubelet_status.stdout"
Systemdの別のアプローチ( Jakujeから ):
- name: Check if cups-browsed service exists
command: systemctl cat cups-browsed
check_mode: no
register: cups_browsed_exists
changed_when: False
failed_when: cups_browsed_exists.rc not in [0, 1]
- name: Stop cups-browsed service
systemd:
name: cups-browsed
state: stopped
when: cups_browsed_exists.rc == 0