diff --git a/ansible_runner/runner_config.py b/ansible_runner/runner_config.py
index 6d462d4..aa1dc22 100644
--- a/ansible_runner/runner_config.py
+++ b/ansible_runner/runner_config.py
@@ -25,10 +25,8 @@ import tempfile
 import logging
 
 from uuid import uuid4
-try:
-    from collections.abc import Mapping
-except ImportError:
-    from collections import Mapping
+from collections import Mapping
+#from distutils.spawn import find_executable
 
 from six import iteritems, string_types
 
@@ -199,10 +197,6 @@ class RunnerConfig(object):
             # Still need to pass default environment to pexpect
             self.env = os.environ.copy()
 
-        # extravars dict passed in via the interface API takes precedence over on-disk
-        if not self.extra_vars and self.loader.isfile('env/extravars'):
-            self.extra_vars = self.loader.abspath('env/extravars')
-
         try:
             self.settings = self.loader.load_file('env/settings', Mapping)
         except ConfigurationError:
@@ -273,6 +267,8 @@ class RunnerConfig(object):
             exec_list.append("--limit")
             exec_list.append(self.limit)
 
+        if self.loader.isfile('env/extravars'):
+            exec_list.extend(['-e', '@{}'.format(self.loader.abspath('env/extravars'))])
         if isinstance(self.extra_vars, dict) and self.extra_vars:
             exec_list.extend(
                 [
@@ -282,8 +278,6 @@ class RunnerConfig(object):
                     )
                 ]
             )
-        elif self.extra_vars:
-            exec_list.extend(['-e', '@%s' % self.extra_vars])
         if self.verbosity:
             v = 'v' * self.verbosity
             exec_list.append('-%s' % v)
diff --git a/ansible_runner/utils.py b/ansible_runner/utils.py
index 2fa2809..58d8464 100644
--- a/ansible_runner/utils.py
+++ b/ansible_runner/utils.py
@@ -14,10 +14,7 @@ import threading
 import pipes
 import uuid
 
-try:
-    from collections.abc import Iterable, Mapping
-except ImportError:
-    from collections import Iterable, Mapping
+from collections import Iterable, Mapping
 from io import StringIO
 from six import string_types
 
@@ -191,14 +188,14 @@ def dump_artifacts(kwargs):
 
     for key in ('envvars', 'extravars', 'passwords', 'settings'):
         obj = kwargs.get(key)
-        if obj:
+        if obj and not os.path.exists(os.path.join(private_data_dir, 'env', key)):
             path = os.path.join(private_data_dir, 'env')
             dump_artifact(json.dumps(obj), path, key)
             kwargs.pop(key)
 
     for key in ('ssh_key', 'cmdline'):
         obj = kwargs.get(key)
-        if obj:
+        if obj and not os.path.exists(os.path.join(private_data_dir, 'env', key)):
             path = os.path.join(private_data_dir, 'env')
             dump_artifact(str(kwargs[key]), path, key)
             kwargs.pop(key)

then env/extravars are overwritten
Take code from the  docs and add extraverts variable

```
import ansible_runner
extravars = {
    'ansible_connection': 'local',
    'test': 'extra'
}

r = ansible_runner.run(private_data_dir='/tmp/demo', playbook='test.yml', extravars=extravars)
print("{}: {}".format(r.status, r.rc))
# successful: 0
for each_host_event in r.events:
    print(each_host_event['event'])
print("Final status:")
print(r.stats)
```

take the demo directory from the repository, where `env/extravars` is

```
---
ansible_connection: local
test: val
```

run the ansible runner and check the `env/extravars`

```
{"test": "extra", "ansible_connection": "local"}
```


According the docs in the code **https://ansible-runner.readthedocs.io/en/latest/_modules/ansible_runner/interface.html#run**

```
 :param extravars: Extra variables to be passed to Ansible at runtime using ``-e``. Extra vars will also be
                      read from ``env/extravars`` in ``private_data_dir``.
```

This not true, they are not read at all and are overwritten.
diff --git a/test/unit/test_runner_config.py b/test/unit/test_runner_config.py
index ec292e9..243bdb3 100644
--- a/test/unit/test_runner_config.py
+++ b/test/unit/test_runner_config.py
@@ -119,14 +119,6 @@ def test_prepare_env_extra_vars_defaults():
     assert rc.extra_vars is None
 
 
-def test_prepare_env_extra_vars():
-    rc = RunnerConfig('/')
-
-    with patch.object(rc.loader, 'isfile', side_effect=lambda x: True):
-        rc.prepare_env()
-        assert rc.extra_vars == '/env/extravars'
-
-
 def test_prepare_env_settings_defaults():
     rc = RunnerConfig('/')
     rc.prepare_env()
@@ -189,9 +181,16 @@ def test_generate_ansible_command():
     cmd = rc.generate_ansible_command()
     assert cmd == ['ansible-playbook', '-i', '/inventory', 'main.yaml']
 
-    rc.extra_vars = '/env/extravars'
+    rc.extra_vars = dict(test="key")
     cmd = rc.generate_ansible_command()
-    assert cmd == ['ansible-playbook', '-i', '/inventory', '-e', '@/env/extravars', 'main.yaml']
+    assert cmd == ['ansible-playbook', '-i', '/inventory', '-e', '\'test="key"\'', 'main.yaml']
+
+    with patch.object(rc.loader, 'isfile', side_effect=lambda x: True):
+        cmd = rc.generate_ansible_command()
+        assert cmd == ['ansible-playbook', '-i', '/inventory', '-e', '@/env/extravars', '-e', '\'test="key"\'', 'main.yaml']
+        rc.extra_vars = None
+        cmd = rc.generate_ansible_command()
+        assert cmd == ['ansible-playbook', '-i', '/inventory', '-e', '@/env/extravars', 'main.yaml']
     rc.extra_vars = None
 
     rc.verbosity = 3

pip install -e .[dev]
parse_log_pytest
pytest
pytest mock
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/ansible/ansible-runner.git@3dc41ee10e423688a8cf59ced5f7416ddc19847f#egg=ansible_runner
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
docutils==0.18.1
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
lockfile==0.12.2
mock==5.2.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pexpect==4.9.0
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
psutil==7.0.0
ptyprocess==0.7.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
python-daemon==2.3.2
PyYAML==6.0.1
six==1.17.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: ansible-runner
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - docutils==0.18.1
      - lockfile==0.12.2
      - mock==5.2.0
      - pexpect==4.9.0
      - psutil==7.0.0
      - ptyprocess==0.7.0
      - python-daemon==2.3.2
      - pyyaml==6.0.1
      - six==1.17.0
prefix: /opt/conda/envs/ansible-runner

test/unit/test_runner_config.py::test_generate_ansible_command
test/unit/test_runner_config.py::test_runner_config_init_defaults test/unit/test_runner_config.py::test_runner_config_with_artifact_dir test/unit/test_runner_config.py::test_runner_config_init_with_ident test/unit/test_runner_config.py::test_prepare_environment_vars_only_strings test/unit/test_runner_config.py::test_prepare_env_ad_hoc_command test/unit/test_runner_config.py::test_prepare_environment_pexpect_defaults test/unit/test_runner_config.py::test_prepare_env_passwords test/unit/test_runner_config.py::test_prepare_env_extra_vars_defaults test/unit/test_runner_config.py::test_prepare_env_settings_defaults test/unit/test_runner_config.py::test_prepare_env_settings test/unit/test_runner_config.py::test_prepare_env_sshkey_defaults test/unit/test_runner_config.py::test_prepare_env_sshkey test/unit/test_runner_config.py::test_prepare_env_defaults test/unit/test_runner_config.py::test_prepare_inventory test/unit/test_runner_config.py::test_generate_ansible_command_with_api_extravars test/unit/test_runner_config.py::test_generate_ansible_command_with_cmdline_args test/unit/test_runner_config.py::test_prepare_command_defaults test/unit/test_runner_config.py::test_prepare_command_with_args test/unit/test_runner_config.py::test_prepare_with_defaults test/unit/test_runner_config.py::test_prepare test/unit/test_runner_config.py::test_prepare_with_ssh_key test/unit/test_runner_config.py::test_wrap_args_with_ssh_agent_defaults test/unit/test_runner_config.py::test_wrap_args_with_ssh_agent_with_auth test/unit/test_runner_config.py::test_wrap_args_with_ssh_agent_silent test/unit/test_runner_config.py::test_process_isolation_defaults test/unit/test_runner_config.py::test_process_isolation_settings
ansible_runner/runner_config.py ansible_runner/utils.py
ansible_runner/runner_config.py ansible_runner/utils.py