Ashar
Ashar

Reputation: 3065

How to execute Play 2 only if Play 1 succeeds in Ansible

I have two Plays having one task each.

The first Play checks if the /var/test.dat exists on each target. Only if the first play is successful do I want the second play to run which executes these scripts in parallel.

If the first play fails i.e the test.dat does not exist I wish to terminate the playbook without the second Play getting executed. For this purpose, I have set any_errors_fatal set to true

I need to have an ansible Play strategy set to free as each of the scripts takes 30 minutes to complete.

My understanding of ansible is limited.

I understand that if I have both the tasks under a single PLAY and set the strategy to free both the tasks will run in parallel which is something I do not want.

---
- name: Play 1- check for login and script
  hosts: all_hosts
  any_errors_fatal: true
  strategy: free
  tasks:

   - name: Check script existence
     shell: "ls /var/test.dat"
     register: checkscript
   - name:
     fail:
       msg: "script {{ scriptdet }} missing on {{ inventory_hostname }}"
     when: checkscript.rc != 0

- name: Play 2- Run scripts
  hosts: all_hosts
  user: "{{ USER }}"
  strategy: free
  tasks:
   - name: Execute backup script
     shell: "{{ scriptdet }}"
     args:
       chdir: ~/..

I tried the above playbook but I see the second play executes despite the first play's task failed.

Can you please suggest how can I get this to work?

Upvotes: 0

Views: 1584

Answers (1)

Tahvok
Tahvok

Reputation: 56

Unless any_errors_fatal is true - Ansible will finish running on all hosts - even if some other host failed. However, as you found out any_errors_fatal does not work with a free strategy.

It's also impossible to create a global variable.

However, you mentioned that you want to use free strategy to speed up the execution. However, free strategy only prevents "blocking new tasks for hosts that have already finished.".

If you need to execute the same task without waiting for other hosts to finish, you need parallelism. Strategy has nothing to do with parallelism.

In Ansible you adjust the number of parallel hosts with forks. However the default is very low, and is only 5.

What you want is to set this number higher - depending on your executing host resources. In my experience with a good amount of cpu and memory, this can be adjusted to hundreds.

You set this either in ansible.cfg or in the command line:

ansible-playbook -f 30 my_playbook.yml

This way you can use the default linear strategy with any_errors_fatal set to true.

Upvotes: 0

Related Questions