### Summary

Trying to run a playbook where we set one of the role parameters using string interpolation causes the argument spec to fail validation.

### Issue Type

Bug Report

### Component Name

role

### Ansible Version

```console
ansible      4.1.0
ansible-core 2.11.1
```


### Configuration

```console
$ ansible-config dump --only-changed


ANY_ERRORS_FATAL(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = True
COLLECTIONS_ON_ANSIBLE_VERSION_MISMATCH(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = error
COLLECTIONS_PATHS(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = ['/Users/ryan/Desktop/de-ansible-core-upgrade/collections']
DEFAULT_CALLBACK_PLUGIN_PATH(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = ['/Users/ryan/Desktop/de-ansible-core-upgrade/callback_plugins']
DEFAULT_FILTER_PLUGIN_PATH(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = ['/Users/ryan/Desktop/de-ansible-core-upgrade/filter_plugins']
DEFAULT_FORCE_HANDLERS(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = True
DEFAULT_INVENTORY_PLUGIN_PATH(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = ['/Users/ryan/Desktop/de-ansible-core-upgrade/inventory_plugins']
DEFAULT_JINJA2_NATIVE(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = True
DEFAULT_LOOKUP_PLUGIN_PATH(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = ['/Users/ryan/Desktop/de-ansible-core-upgrade/lookup_plugins']
DEFAULT_MODULE_PATH(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = ['/Users/ryan/Desktop/de-ansible-core-upgrade/library', '/Users/ryan/Desktop/de-ansible-core-upgrade/roles/*/library', '/Users/ryan/Desktop/de-ansible-core-upgrade/roles-vendored/*/library']
DEFAULT_PRIVATE_ROLE_VARS(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = True
DEFAULT_ROLES_PATH(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = ['/Users/ryan/Desktop/de-ansible-core-upgrade/roles-vendored', '/Users/ryan/Desktop/de-ansible-core-upgrade/roles']
DEFAULT_TIMEOUT(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = 10
DEPRECATION_WARNINGS(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = True
DIFF_ALWAYS(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = True
INTERPRETER_PYTHON(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = auto_legacy_silent
RETRY_FILES_ENABLED(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = False
TRANSFORM_INVALID_GROUP_CHARS(/Users/ryan/Desktop/de-ansible-core-upgrade/ansible.cfg) = never
```


### OS / Environment

macOS 11.4

### Steps to Reproduce

Consider this playbook and example role, the role has an option which accepts a list of dictionaries, one of the valid keys is `state`, which we set from a var in the playbook, defaulting to `absent`, but can be set when running the playbook for example `-e state=present`:

```yaml (paste below)
vars:
  state: absent
roles:
  - role: rolename
    my_role_parameters:
      - state: "{{ state }}"
```

The role argument spec for this looks like the following:

```
argument_specs:
  main:
    short_description: Bla bla
    author: Ryan Conway
    options:
      my_role_parameters:
        description: bla bla bla
        type:        list
        elements:    dict
        options:   
          state:
            description: bla bla bla
            type:        str
            required:    false
            default:     present
            choices:
              - present
              - absent
              - started
              - stopped
```

### Expected Results

When the `state` variable contains one of the value options, the role argument spec validation should pass.

### Actual Results

```console
FAILED! => {"argument_errors": ["value of state must be one of: present, absent, started, stopped, got: {{ state }} found in my_role_parameters"]
```

it looks like the "{{ state }}" interpolation does not get interpreted before the role argument spec is validated, so it treats it as a string literal? Or have I messed up the role specification?


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from ansible.errors import AnsibleError
from ansible.plugins.action import ActionBase
from ansible.module_utils.six import iteritems, string_types
from ansible.module_utils.common.arg_spec import ArgumentSpecValidator
from ansible.module_utils.errors import AnsibleValidationErrorMultiple
class ActionModule(ActionBase):
    ''' Validate an arg spec'''
    TRANSFERS_FILES = False
    def get_args_from_task_vars(self, argument_spec, task_vars):
        '''
        Get any arguments that may come from `task_vars`.
        Expand templated variables so we can validate the actual values.
        :param argument_spec: A dict of the argument spec.
        :param task_vars: A dict of task variables.
        :returns: A dict of values that can be validated against the arg spec.
        '''
        args = {}
        for argument_name, argument_attrs in iteritems(argument_spec):
            if argument_name in task_vars:
                if isinstance(task_vars[argument_name], string_types):
                    value = self._templar.do_template(task_vars[argument_name])
                    if value:
                        args[argument_name] = value
                else:
                    args[argument_name] = task_vars[argument_name]
        return args
    def run(self, tmp=None, task_vars=None):