##### SUMMARY
`extract()` filter fails when key does not exist in container

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
core filters

##### ANSIBLE VERSION
```
ansible 2.10.0.dev0
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/bidord/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /home/bidord/dev/ansible/lib/ansible
  executable location = /home/bidord/dev/ansible/bin/ansible
  python version = 2.7.15+ (default, Jul  9 2019, 16:51:35) [GCC 7.4.0]
```

##### CONFIGURATION
(default)
```
```

##### OS / ENVIRONMENT
Any.

##### STEPS TO REPRODUCE
test-extract.yml:
```yaml
---
- hosts: localhost
  gather_facts: false
  vars:
    container:
      key:
        subkey: value

  tasks:
    - ignore_errors: true
      block:
        - name: bad container
          debug:
            msg: "{{ 'key' | extract(badcontainer) | default('SUCCESS') }}"

        - name: bad container, subkey
          debug:
            msg: "{{ 'key' | extract(badcontainer, 'subkey') | default('SUCCESS') }}"

        - name: bad container, subkey as attribute
          debug:
            msg: "{{ ('key' | extract(badcontainer)).subkey | default('SUCCESS') }}"

        - name: standard dict, bad key
          debug:
            msg: "{{ 'badkey' | extract(container) | default('SUCCESS') }}"

        - name: standard dict, bad key, subkey
          debug:
            msg: "{{ 'badkey' | extract(container, 'subkey') | default('SUCCESS') }}"

        - name: standard dict, bad key, subkey as attribute
          debug:
            msg: "{{ ('badkey' | extract(container)).subsubkey | default('SUCCESS') }}"

        - name: standard dict, bad subkey
          debug:
            msg: "{{ 'key' | extract(container, 'badsubkey') | default('SUCCESS') }}"

        - name: standard dict, bad subkey, subsubkey
          debug:
            msg: "{{ 'key' | extract(container, ['badsubkey', 'subsubkey']) | default('SUCCESS') }}"

        - name: standard dict, bad subkey, subkey as attribute
          debug:
            msg: "{{ ('key' | extract(container, 'badsubkey')).subsubkey | default('SUCCESS') }}"

        - name: hostvars, bad key
          debug:
            msg: "{{ 'badkey' | extract(hostvars) | default('SUCCESS') }}"

        - name: hostvars, bad key, subkey
          debug:
            msg: "{{ 'badkey' | extract(hostvars, 'subkey') | default('SUCCESS') }}"

        - name: hostvars, bad key, subkey as attribute
          debug:
            msg: "{{ ('badkey' | extract(hostvars)).subsubkey | default('SUCCESS') }}"

        - name: hostvars, bad subkey
          debug:
            msg: "{{ 'localhost' | extract(hostvars, 'badsubkey') | default('SUCCESS') }}"

        - name: hostvars, bad subkey, subsubkey
          debug:
            msg: "{{ 'localhost' | extract(hostvars, ['badsubkey', 'subsubkey']) | default('SUCCESS') }}"

        - name: hostvars, bad subkey, subsubkey as attribute
          debug:
            msg: "{{ ('localhost' | extract(hostvars, 'badsubkey')).subsubkey | default('SUCCESS') }}"
```

##### EXPECTED RESULTS
All tests should print `SUCCESS`.
```
$ ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook test-extract.yml

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

TASK [bad container] **********************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [bad container, subkey] **************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [bad container, subkey as attribute] *************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad key] *************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad key, subkey] *****************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad key, subkey as attribute] ****************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad subkey] **********************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad subkey, subsubkey] ***********************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad subkey, subkey as attribute] *************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad key] ******************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad key, subkey] **********************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad key, subkey as attribute] *********************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad subkey] ***************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad subkey, subsubkey] ****************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad subkey, subsubkey as attribute] ***************************************************************
ok: [localhost] =>
  msg: SUCCESS

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


##### ACTUAL RESULTS
Some tests fail during the execution of `extract()`.
Others return `Undefined` instead of `AnsibleUndefined`, which then fails if we try to access a subkey using jinja2 `.` syntax.

```
$ ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook test-extract.yml

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

TASK [bad container] **********************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [bad container, subkey] **************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [bad container, subkey as attribute] *************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad key] *************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: KeyError: 'badkey'
fatal: [localhost]: FAILED! =>
  msg: Unexpected failure during module execution.
...ignoring

TASK [standard dict, bad key, subkey] *****************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: KeyError: 'badkey'
fatal: [localhost]: FAILED! =>
  msg: Unexpected failure during module execution.
...ignoring

TASK [standard dict, bad key, subkey as attribute] ****************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: KeyError: 'badkey'
fatal: [localhost]: FAILED! =>
  msg: Unexpected failure during module execution.
...ignoring

TASK [standard dict, bad subkey] **********************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad subkey, subsubkey] ***********************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [standard dict, bad subkey, subkey as attribute] *************************************************************
fatal: [localhost]: FAILED! =>
  msg: |-
    The task includes an option with an undefined variable. The error was: None is undefined

    The error appears to be in '/home/bidord/dev/ansible-test/test-extract.yml': line 44, column 11, but may
    be elsewhere in the file depending on the exact syntax problem.

    The offending line appears to be:


            - name: standard dict, bad subkey, subkey as attribute
              ^ here
...ignoring

TASK [hostvars, bad key] ******************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad key, subkey] **********************************************************************************
fatal: [localhost]: FAILED! =>
  msg: |-
    The task includes an option with an undefined variable. The error was: "hostvars['badkey']" is undefined

    The error appears to be in '/home/bidord/dev/ansible-test/test-extract.yml': line 52, column 11, but may
    be elsewhere in the file depending on the exact syntax problem.

    The offending line appears to be:


            - name: hostvars, bad key, subkey
              ^ here
...ignoring

TASK [hostvars, bad key, subkey as attribute] *********************************************************************
fatal: [localhost]: FAILED! =>
  msg: |-
    The task includes an option with an undefined variable. The error was: "hostvars['badkey']" is undefined

    The error appears to be in '/home/bidord/dev/ansible-test/test-extract.yml': line 56, column 11, but may
    be elsewhere in the file depending on the exact syntax problem.

    The offending line appears to be:


            - name: hostvars, bad key, subkey as attribute
              ^ here
...ignoring

TASK [hostvars, bad subkey] ***************************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad subkey, subsubkey] ****************************************************************************
ok: [localhost] =>
  msg: SUCCESS

TASK [hostvars, bad subkey, subsubkey as attribute] ***************************************************************
fatal: [localhost]: FAILED! =>
  msg: |-
    The task includes an option with an undefined variable. The error was: None is undefined

    The error appears to be in '/home/bidord/dev/ansible-test/test-extract.yml': line 68, column 11, but may
    be elsewhere in the file depending on the exact syntax problem.

    The offending line appears to be:


            - name: hostvars, bad subkey, subsubkey as attribute
              ^ here
...ignoring

PLAY RECAP ********************************************************************************************************
localhost                  : ok=15   changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=7
```


Edit: actual results was a wrong copy/paste from a previous version of test-extract.yml
''' A special view of vars_cache that adds values from the inventory when needed. '''
    def __init__(self, inventory, variable_manager, loader):
        self._lookup = dict()
        self._inventory = inventory
        self._loader = loader
        self._variable_manager = variable_manager
        variable_manager._hostvars = self
    def set_variable_manager(self, variable_manager):
        self._variable_manager = variable_manager
        variable_manager._hostvars = self
    def set_inventory(self, inventory):
        self._inventory = inventory
    def _find_host(self, host_name):
        
        return self._inventory.get_host(host_name)
    def raw_get(self, host_name):
        '''
        Similar to __getitem__, however the returned data is not run through
        the templating engine to expand variables in the hostvars.
        '''
        host = self._find_host(host_name)
        if host is None:
            return Undefined(name="hostvars['%s']" % host_name)
        return self._variable_manager.get_vars(host=host, include_hostvars=False)
    def __getitem__(self, host_name):