Controleer of er service bestaat met Ansible

Ik heb een Ansible-playbook voor het implementeren van een Java-app als een init.d-daemon.

Als beginner in zowel Ansible als Linux heb ik problemen om taken voorwaardelijk uit te voeren op een host op basis van de status van de host.

Ik heb namelijk een aantal hosts die de service al aanwezig hebben en draaien waar ik deze wil stoppen voordat ik iets anders ga doen. En dan zijn er misschien nieuwe hosts, die de service nog niet hebben. Ik kan dus niet zomaar service: name={{service_name}} state=stoppedgebruiken, omdat dit niet werkt op nieuwe hosts.

Hoe kan ik dit bereiken? Dit is wat ik tot nu toe heb:

 - 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

Antwoord 1, autoriteit 100%

Bekijk de service_factsmodule, nieuw in Ansible 2.5.

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

Antwoord 2, autoriteit 87%

Natuurlijk zou ik ook kunnen controleren of het wrapper-script bestaat in /etc/init.d. Dus dit is waar ik mee eindigde:

 - 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

Antwoord 3, autoriteit 19%

Ik heb Florian’s antwoordaangepast om alleen de retourcode van de opdracht servicete gebruiken (deze werkte aan 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

Antwoord 4, autoriteit 17%

Het zou fijn zijn als de “service”-module “niet-herkende service”-fouten zou kunnen verwerken.

Dit is mijn benadering, waarbij ik de opdracht servicegebruik in plaats van te controleren op een init-script:

- 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"
  • controleer de afsluitcode van “servicestatus” en accepteer de afsluitcode 0 wanneer de uitvoer “niet-herkende service” bevat
  • als de afsluitcode 0 was, is die service geïnstalleerd (gestopt of actief)

Antwoord 5, autoriteit 6%

Een andere benadering voor systemd (van 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

Antwoord 6

Op deze manier heeft het gebruik van alleen de servicemodule voor ons gewerkt:

- name: Disable *service_name*
  service:
    name: *service_name*
    enabled: no
    state: stopped
  register: service_command_output
  failed_when: >
    service_command_output|failed
    and 'unrecognized service' not in service_command_output.msg
    and 'Could not find the requested service' not in service_command_output.msg

Antwoord 7

Mijn paar centen. Dezelfde aanpak als hierboven, maar voor kubernetes

Controleer of de kublete-service actief is

- name: "Obtain state of kublet service"
  command: systemctl status kubelet.service
  register: kubelet_status
  failed_when: kubelet_status.rc > 3

Debug-bericht weergeven als de kublet-service niet actief is

- debug:
    msg: "{{ kubelet_status.stdout }}"
  when: "'running' not in kubelet_status.stdout"

Other episodes