diff --git a/lib/ansible/executor/playbook_executor.py b/lib/ansible/executor/playbook_executor.py
index 29ac3e9b7c..041f51bf70 100644
--- a/lib/ansible/executor/playbook_executor.py
+++ b/lib/ansible/executor/playbook_executor.py
@@ -128,6 +128,7 @@ class PlaybookExecutor:
                     else:
                         self._tqm._unreachable_hosts.update(self._unreachable_hosts)
 
+                        break_play = False
                         # we are actually running plays
                         for batch in self._get_serialized_batches(new_play):
                             if len(batch) == 0:
@@ -147,8 +148,10 @@ class PlaybookExecutor:
                             failed_hosts_count = len(self._tqm._failed_hosts) + len(self._tqm._unreachable_hosts)
                             if new_play.max_fail_percentage is not None and \
                                int((new_play.max_fail_percentage)/100.0 * len(batch)) > int((len(batch) - failed_hosts_count) / len(batch) * 100.0):
+                                break_play = True
                                 break
                             elif len(batch) == failed_hosts_count:
+                                break_play = True
                                 break
 
                             # save the unreachable hosts from this batch
@@ -159,6 +162,9 @@ class PlaybookExecutor:
                             if result not in (0, 3):
                                 break
 
+                        if break_play:
+                            break
+
                     i = i + 1 # per play
 
                 if entry: