### Summary

Become is not applied on roles when playbook has `become: true` set.



### Issue Type

Bug Report

### Component Name

become

### Ansible Version

```console
$ ansible --version
ansible [core 2.14.0b2]
  config file = /home/twouters/.ansible.cfg
  configured module search path = ['/home/twouters/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/twouters/ansible-2.14/lib/python3.10/site-packages/ansible
  ansible collection location = /home/twouters/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/twouters//ansible-2.14/bin/ansible
  python version = 3.10.7 (main, Sep  6 2022, 21:22:27) [GCC 12.2.0] (/home/twouters/ansible-2.14/bin/python)
  jinja version = 3.1.2
  libyaml = True
```


### Configuration

```console
# if using a version older than ansible-core 2.12 you should omit the '-t all'
$ ansible-config dump --only-changed -t all
```


### OS / Environment

Arch Linux and Debian but probably irrelevant

### Steps to Reproduce

```
$ tree -Ap                                       
[drwx------]  .
├── [drwxr-xr-x]  testrole
│   └── [drwxr-xr-x]  tasks
│       └── [-rw-r--r--]  main.yml
└── [-rw-r--r--]  test.yml

2 directories, 2 files
```
```
$ cat test.yml 
---

- hosts: localhost
  become: true
  gather_facts: no
  pre_tasks:
    - ansible.builtin.command: whoami
      register: whoami
    - ansible.builtin.assert:
        that: whoami.stdout == "root"
  roles:
    - testrole
```

```
$ cat testrole/tasks/main.yml 
---

- ansible.builtin.command: whoami
  register: whoami
- ansible.builtin.assert:
    that: whoami.stdout == "root"
```

### Expected Results

All assertions pass and become is applied to all tasks

```
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost
does not match 'all'

PLAY [localhost] ***************************************************************************************

TASK [ansible.builtin.command] *************************************************************************
changed: [localhost]

TASK [ansible.builtin.assert] **************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [testrole : ansible.builtin.command] **************************************************************
changed: [localhost]

TASK [testrole : ansible.builtin.assert] ***************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "All assertions passed"
}

PLAY RECAP *********************************************************************************************
localhost                  : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
```

### Actual Results

```console
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost
does not match 'all'

PLAY [localhost] ***************************************************************************************

TASK [ansible.builtin.command] *************************************************************************
changed: [localhost]

TASK [ansible.builtin.assert] **************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [testrole : ansible.builtin.command] **************************************************************
changed: [localhost]

TASK [testrole : ansible.builtin.assert] ***************************************************************
fatal: [localhost]: FAILED! => {
    "assertion": "whoami.stdout == \"root\"",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}

PLAY RECAP *********************************************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
'''
        Evaluates all attributes and sets them to the evaluated version,
        so that all future accesses of attributes do not need to evaluate
        parent attributes.
        '''
        if not self._squashed:
            for name in self.fattributes:
                setattr(self, name, getattr(self, name))
            self._squashed = True
    def copy(self):
        '''
        Create a copy of this object and return it.
        '''
        try:
            new_me = self.__class__()
        except RuntimeError as e:
            raise AnsibleError("Exceeded maximum object depth. This may have been caused by excessive role recursion", orig_exc=e)
        for name in self.fattributes:
            setattr(new_me, name, shallowcopy(getattr(self, f'_{name}', Sentinel)))
        new_me._loader = self._loader
        new_me._variable_manager = self._variable_manager
        new_me._validated = self._validated
        new_me._finalized = self._finalized
        new_me._uuid = self._uuid
        
        if hasattr(self, '_ds'):
            new_me._ds = self._ds
        return new_me
    def get_validated_value(self, name, attribute, value, templar):