### 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
'''
        Sets the loader on this object and recursively on parent, child objects.
        This is used primarily after the Task has been serialized/deserialized, which
        does not preserve the loader.
        '''
        self._loader = loader
        if self._parent:
            self._parent.set_loader(loader)
    def _get_parent_attribute(self, attr, omit=False):
        '''
        Generic logic to get the attribute or parent attribute for a task value.
        '''
        extend = self.fattributes.get(attr).extend
        prepend = self.fattributes.get(attr).prepend
        try:
            
            if omit:
                value = Sentinel
            else:
                value = getattr(self, f'_{attr}', Sentinel)