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.