Conditional execution on hosts where service exists

I have an Ansible playbook for deploying a Java app as an init.d daemon.

Being a beginner in both Ansible and Linux I’m having trouble to conditionally execute tasks on a host based on the host’s status.

Namely I have some hosts having the service already present and running where I want to stop it before doing anything else. And then there might be new hosts, which don’t have the service yet. So I can’t simply use service: name={{service_name}} state=stopped, because this will fail on new hosts.

How I can I achieve this? Here’s what I have so far:

  - 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

Replying on phone so will keep it short.

Use ignore errors to allow the stop service team to fail without stopping the play

you can:

- stat: /etc/init.d/my_service
  register: my_service

and now make other tasks conditional on :

  when: my_service|exists

Great! Thanks.

This is what I ended up with:

- 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

Sorry for the super late reply to this, but you’ll miss services not found in the init.d directory. For example, this would fail on systemd, upstart, runit, and so on. It would also be platform specific to Linux. These may not be a big deal for the original author, but it should be noted for posterity’s sake.

Tom