meta data for this page
SaltStack - salt-ssh ImportError backports.ssl_match_hostname
Beschreibung
Seid SaltStack Version 2015.08 existieren neue Abhängigkeiten auf SSL Funktionen. Welche für ältere Python Versionen backported wurden. backports.ssl_match_hostname macht allerdings Probleme auf älteren Systemen, weil salt-ssh das Script zwar mit in das Package aufnimmt. Der ausführende salt-call auf dem Zielsystem es aber nicht mehr finden kann.
Die Folge: salt-ssh bricht mit einem Python Traceback ab und liefert die Fehlermeldung
ImportError: No module named backports.ssl_match_hostname
Gemeldet wurde das schon vor langer Zeit und zwar mehrfach. Allerdings hat über ein Jahr keiner einen Workaround gebaut.
Issues von anderen:
Mein Issue: https://github.com/saltstack/salt/issues/37355
Mein Pull Request: https://github.com/saltstack/salt/pull/37358
Stand 07.02.2017:
Keine Ahnung was man von solchen Entwicklern halten soll, aber sie bekommen weder ihren Jenkins in den Griff, noch können sie verwertbare Informationen liefern, was am Patch stört, noch bekommen sie eine alternative Lösung dafür gebacken. Mein Pull-Request wurde gemerged und reverted. Damit ist der Patch nicht enthalten und mein Pull Request abgeschlossen.
Vielen Dank auch …
Stand 11.11.2018:
Zwischenzeitlich war noch einer über das Problem gestolpert und hat einen neuen Issue aufgemacht: https://github.com/saltstack/salt/issues/41020
Dort schreibt man nun zumindest, dass mein Patch $andere Probleme verursachen würde. Welche genau behalten sie nach wie vor für sich.
Workaround
Der Workaround ist einfach: Symlink für den backports-Ordner erstellen und auf das Verzeichnis verweisen, in dem die Scripte wirklich liegen. Diff für SaltStack Version 2019.2.0:
- thin.py.diff
--- /usr/lib/python2.7/dist-packages/salt/utils/thin.py.orig 2019-03-12 11:50:38.844434340 +0000 +++ /usr/lib/python2.7/dist-packages/salt/utils/thin.py 2019-03-12 12:20:08.170266344 +0000 @@ -120,6 +120,12 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), namespace and os.path.join(namespace, base) or base)) + +SSRC=os.path.join(os.path.dirname(__file__),'pyall','salt','ext') +SDEST=os.path.join(os.path.dirname(__file__),'pyall','backports') +if not os.path.isdir(SDEST): + os.symlink(SSRC,SDEST) + if __name__ == '__main__': from salt.scripts import salt_call salt_call()
Änderung muss auf dem Quell-System (auf dem salt-ssh ausgeführt wird) erfolgen. Allerdings sollten danach auf allen beteiligten Systemen die Salt Caches unter
- /var/tmp/.<user>_<hash>_salt (bspw. /var/tmp/.root_3dd5d0_salt)
- /var/cache/salt/master/thin
gelöscht werden.