web-dev-qa-db-ja.com

Ansibleでサービスが存在するかどうかを確認します

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
32
EagleBeak

もちろん、ラッパースクリプトが/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
31
EagleBeak

service_facts モジュール、Ansible 2.5の新機能。

- name: Populate service facts
  service_facts:
- debug:
    msg: Docker installed!
  when: "'docker' in services"
17
Aidan Feldman

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
7
darkwing

「サービス」モジュールが「認識されないサービス」エラーを処理できればいいでしょう。

これは私のアプローチで、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"
  • 「サービスステータス」の終了コードを確認し、出力に「認識されないサービス」が含まれる場合は終了コード0を受け入れます。
  • 終了コードが0の場合、そのサービスはインストールされています(停止または実行中)
7
Florian

私の数セント。上記と同じアプローチですが、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"
0
Lukasz Dynowski

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
0
sourcejedi