### Summary

I want to do an action only once on a cluster, I execute a playbook with three hosts and serial :1.
The first host execute the action with meta: end_play at the end. The playbook continue for other hosts but I see meta: end play with verbose -vv iin runtime.
```yaml
- name: Backup postgresql data and push to aws with barman-cloud
  hosts:  "{{ target }}"
  become: true
  become_user: postgres
  serial: 1
  any_errors_fatal: true
  gather_facts: true
```

This is the end of the task I want to execute on one host
```yaml
- name: Remove file config file
  become_user: root
  file:
    path: "{{ item }}"
    state: absent
  with_items:
    - /tmp/config
    - /tmp/credentials
    - /etc/barman.conf
    - /etc/barman.d/

- name: Backup succeeded - End play
  meta: end_play
```
```
TASK [Remove file config file] ***************************************************************
changed: [int_postgres1] => (item=/tmp/config) => {"ansible_loop_var": "item", "changed": true, "item": "/tmp/config", "path": "/tmp/config", "state": "absent"}
changed: [int_postgres1] => (item=/tmp/credentials) => {"ansible_loop_var": "item", "changed": true, "item": "/tmp/credentials", "path": "/tmp/credentials", "state": "absent"}
changed: [int_postgres1] => (item=/etc/barman.conf) => {"ansible_loop_var": "item", "changed": true, "item": "/etc/barman.conf", "path": "/etc/barman.conf", "state": "absent"}
changed: [int_postgres1] => (item=/etc/barman.d/) => {"ansible_loop_var": "item", "changed": true, "item": "/etc/barman.d/", "path": "/etc/barman.d/", "state": "absent"}
META: ending play

PLAY [Backup postgresql data and push to aws with barman-cloud] ******************************
Friday 19 March 2021  20:20:03 +0100 (0:00:01.171)       0:00:18.459 ********** 

TASK [Gathering Facts] ***********************************************************************
ok: [int_postgres2]
META: ran handlers
Friday 19 March 2021  20:20:04 +0100 (0:00:01.490)       0:00:19.950 ********** 
Friday 19 March 2021  20:20:05 +0100 (0:00:00.059)       0:00:20.010 ********** 

TASK [Check if postgres server is replica] ***************************************************
changed: [int_postgres2] => {"changed": true, "cmd": "curl -s http://***:8008/patroni | jq -r .role", "delta": "0:00:00.017332", "end": "2021-03-19 20:20:05.290983", "rc": 0, "start": "2021-03-19 20:20:05.273651", "stderr": "", "stderr_lines": [], "stdout": "replica", "stdout_lines": ["replica"]}
META: end_host conditional evaluated to false, continuing execution for int_postgres2
Friday 19 March 2021  20:20:05 +0100 (0:00:00.344)       0:00:20.355 ********** 
```
EDIT: Also run_once doesnt work with serial: 1, all hosts will execute the command in the same playbook.
I removed serial: 1 and add run_once on all commands I wanted to execute only once but I keep this issue because I'm not sure this is the expected behaviour for meta and serial: 1.

Tell me if I am wrong.


### Issue Type

Bug Report

### Component Name

meta

### Ansible Version

```console (paste below)
$ ansible --version
ansible 2.10.3
```


### Configuration

```console (paste below)
$ ansible-config dump --only-changed

```


### OS / Environment

Ubuntu 18.04

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)
  hosts:  "{{ target }}"
  become: true
  become_user: postgres
  serial: 1
  any_errors_fatal: true
  gather_facts: true
```


### Expected Results

end_play meta stop all hosts even if serial: 1 is specified

### Actual Results

```console (paste below)
playbook continu and doesnt stop with meta end_play
```

#
#
#
#
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import cmd
import functools
import os
import pprint
import sys
import threading
import time
from collections import deque
from multiprocessing import Lock
from jinja2.exceptions import UndefinedError
from ansible import constants as C
from ansible import context
from ansible.errors import AnsibleError, AnsibleFileNotFound, AnsibleParserError, AnsibleUndefinedVariable
from ansible.executor import action_write_locks
from ansible.executor.process.worker import WorkerProcess
from ansible.executor.task_result import TaskResult
from ansible.executor.task_queue_manager import CallbackSend
from ansible.module_utils.six.moves import queue as Queue
from ansible.module_utils.six import iteritems, itervalues, string_types
from ansible.module_utils._text import to_text
from ansible.module_utils.connection import Connection, ConnectionError
from ansible.playbook.conditional import Conditional
from ansible.playbook.handler import Handler