PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python parallele Skripte anstoßen


satanicImephisto
2018-02-14, 19:34:40
Hallo zusammen,
ich hoffe einige Leute mit mehr Wissen als ich, können mir weiterhelfen.

Ich habe ein Python Script geschrieben, welches mittels Netmiko/Paramiko jeweils ein SSH Connect auf Cisco Devices durchführt und dort diverse Sachen auslesen, Konfig verändern usw. kann.
Zunächst hatte ich das Skript so geschrieben, dass aus einer Datei Zeilenweise die verschiedenen Variablen (IP Adresse, User, passwort usw.) ausgelesen werden und dann einfach bis zum Ende nacheinander abgearbeitet werden. Die Futterdatei sieht etwas so aus:

192.168.1.1, cisco, password, cisco_ios
192.167.1.1, cisco2, passwordA, cisco_ios
192.168.3.1, cisco, passwordB, cisco_ios_telnet
192.168.4.1, cisco3, passwordC, cisco_ios

Das dauert aber logischerweise zu lang (Device Anzahl befindet sich jeweils im 3 oder 4 stelligen Bereich).

Nun habe ich das Skript so umgeschrieben, dass ich in der Linux Shell einfach das Skript aufrufe und die Parameter für ein Device einfach dahinter schreibe, also:

./Skript.py 192.168.1.1 cisco password cisco_ios

Jetzt habe ich verschiedene Geschichten mir angeschaut, ich verstehe aber aber weder die os.fork Geschichte genug, noch die multiprocessing Geschichte. Ich find auch nicht den Trigger, wo ich limitieren kann wieviele gleichzeitige Sessions laufen sollen. Ich müsste ja eigentlich "nur" die Parameter auf die Linux Shell mit übergeben.

Folgendes Beispiel hab ich mal verunstaltet , um evtl. direkt aus der Futterdatei die Verbindungen aufzurufen. Aber an welcher Stelle muss ich den tatsächlichen Deviceaufruf ( "device = ConnectHandler(
device_type=Variable[3],ip=Variable[0],username=Variable[1],password=Variable[2],timeout=5)" )machen?

#!/usr/bin/env python3

import os

from netmiko import ConnectHandler
from netmiko.ssh_exception import NetMikoTimeoutException
from paramiko.ssh_exception import SSHException



datei=open("Futter.txt", "r")

for zeile in datei:
print (zeile)
Variable=zeile.split(',')
pid = os.fork()
if pid == 0:
print "%d just was created." % os.getpid()
else:
print "%d just created %d." % (os.getpid(), pid)

nalye
2018-02-14, 19:40:09
dsh oder parallelssh sind keine Alternativen?

satanicImephisto
2018-02-14, 20:07:06
parallelssh hatte ich auch schon bei meiner Suche gefunden, ich würde aber halt schon gerne die Vorteile von paramiko/netmiko mitnehmen. Ich brauch das halt wirklich nur für TK Equipement. Letztendlich scheitert es bei mir derzeit nur am Verständnis, was diese ganzen fork Varianten wirklich tun, ich bin nicht wirklich tief in Linux oder der Programmierung drin...bisher ^^
Und wie gesagt, ich verstehe bisher nicht, wo die Anzahl der Threads geregelt wird, auch bei parallelssh sehe ich das nicht auf Anhieb. Ich kann mir nicht vorstellen, dass mein Server mal ebend 1000 Sessions gleichzeitig aufmacht und dabei nicht abraucht.

Edit: Ich hab mir ertmal nun damit geholfen, dass ich mittels Perl Forkmanager das entsprechende Python Skript aufrufe ^^ Sprich ich übergebe die Parameter aus jeweils einer Zeile und starte damit jeweils ein Py Skript. Bei Perl weiß ich was ich mache und wie ich es machen muss, bei Python hab ich derzeit irgendwie das bisher nicht adaptieren können.

Erdbeermayonnaise
2018-02-17, 19:52:39
parallelssh hatte ich auch schon bei meiner Suche gefunden, ich würde aber halt schon gerne die Vorteile von paramiko/netmiko mitnehmen. Ich brauch das halt wirklich nur für TK Equipement. Letztendlich scheitert es bei mir derzeit nur am Verständnis, was diese ganzen fork Varianten wirklich tun, ich bin nicht wirklich tief in Linux oder der Programmierung drin...bisher ^^
Und wie gesagt, ich verstehe bisher nicht, wo die Anzahl der Threads geregelt wird, auch bei parallelssh sehe ich das nicht auf Anhieb. Ich kann mir nicht vorstellen, dass mein Server mal ebend 1000 Sessions gleichzeitig aufmacht und dabei nicht abraucht.

Edit: Ich hab mir ertmal nun damit geholfen, dass ich mittels Perl Forkmanager das entsprechende Python Skript aufrufe ^^ Sprich ich übergebe die Parameter aus jeweils einer Zeile und starte damit jeweils ein Py Skript. Bei Perl weiß ich was ich mache und wie ich es machen muss, bei Python hab ich derzeit irgendwie das bisher nicht adaptieren können.

Du solltest das gleiche unter Python mit subprocess.Popen erreichen können:
https://docs.python.org/3/library/subprocess.html#subprocess.Popen

Aber eleganter wäre irgendwie deine anfängliche Lösung mit einer Datei direkt zu parallelisieren. Dazu würde ich mir mal multiprocessing.pool anschauen:
https://docs.python.org/3.6/library/multiprocessing.html#multiprocessing.pool.Pool