# SSH Ext Alternatives

In the 2019.2.0 release the `ssh_ext_alternatives` feature was added. This allows salt-ssh to work across different supported python versions. You will need to ensure you have the following:

> - Salt is installed, with all required dependencies for the Python version.

> - Everything needs to be importable from the respective Python environment.

To enable using this feature you will need to edit the master configuration similar to below:

    ssh_ext_alternatives:
        2019.2:                     # Namespace, can be anything.
            py-version: [2, 7]      # Constraint to specific interpreter version
            path: /opt/2019.2/salt  # Main Salt installation directory.
            dependencies:           # List of dependencies and their installation paths
              jinja2: /opt/jinja2
              yaml: /opt/yaml
              tornado: /opt/tornado
              msgpack: /opt/msgpack
              certifi: /opt/certifi
              singledispatch: /opt/singledispatch.py
              singledispatch_helpers: /opt/singledispatch_helpers.py
              markupsafe: /opt/markupsafe
              backports_abc: /opt/backports_abc.py

Warning

When using Salt versions >= 3001 and Python 2 is your `py-version` you need to use an older version of Salt that supports Python 2. For example, if using Salt-SSH version 3001 and you do not want to install Python 3 on your target host you can use `ssh_ext_alternatives`'s `path` option. This option needs to point to a 2019.2.3 Salt installation directory on your Salt-SSH host, which still supports Python 2.

## auto_detect

In the 3001 release the `auto_detect` feature was added for `ssh_ext_alternatives`. This allows salt-ssh to automatically detect the path to all of your dependencies and does not require you to define them under `dependencies`.

    ssh_ext_alternatives:
        2019.2:                     # Namespace, can be anything.
            py-version: [2, 7]      # Constraint to specific interpreter version
            path: /opt/2019.2/salt  # Main Salt installation directory.
            auto_detect: True       # Auto detect dependencies
            py_bin: /usr/bin/python2.7 # Python binary path used to auto detect dependencies

If `py_bin` is not set alongside `auto_detect`, it will attempt to auto detect the dependencies using the major version set in `py-version`. For example if you have `[2, 7]` set as your `py-version`, it will attempt to use the binary `python2`.

You can also use `auto_detect` and `dependencies` together.

    ssh_ext_alternatives:
        2019.2:                     # Namespace, can be anything.
            py-version: [2, 7]      # Constraint to specific interpreter version
            path: /opt/2019.2/salt  # Main Salt installation directory.
            auto_detect: True       # Auto detect dependencies
            py_bin: /usr/bin/python2.7 # Python binary path to auto detect dependencies
            dependencies:           # List of dependencies and their installation paths
              jinja2: /opt/jinja2

If a dependency is defined in the `dependencies` list `ssh_ext_alternatives` will use this dependency, instead of the path that `auto_detect` finds. For example, if you define `/opt/jinja2` under your `dependencies` for jinja2, it will not try to autodetect the file path to the jinja2 module, and will favor `/opt/jinja2`.