Решил использовать paramiko с авторизацией по ключу, а хосты обходить в отдельных потоках.
Вкратце: здесь config содержит настройки хостов и список интересующих точек монтирования. Результат пиклится в дамп.
Проблема в том, что если monitored_hosts содержит больше одного хоста, то скрипт создает только один дамп, для второго выдается ошибка SSHException: Negotiation failed. При чем если поставить паузу в 1 сек в цикле после dg.start(), то все проходит нормально. А если паузу поставить в 0.5, то второй файл получается обрезанным.
Есть у кого-либо подобный опыт, поделитесь решением?
python 2.4.3, paramiko 1.7
import paramiko, os, re, pickle from ConfigParser import ConfigParser import threading import sys sys.path.append('.') import config monitored_hosts = [config.host1, config.host2, ] class DataGatherer(threading.Thread): def __init__(self, entry): super(DataGatherer, self).__init__() self.cli = paramiko.SSHClient() self.cli.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) self.e = entry def run(self): try: try: self.cli.connect(self.e.host, self.e.port, self.e.username) stdin, stdout, stderr = self.cli.exec_command( self.e.df_command ) lst = list() for line in stdout: items = re.match(df_format, line.strip()) data = dict() for col in cols: data[col] = items.group(col) if data['mountpoint'] in self.e.mountpoints: lst.append(data) f = open('tmp/%s.df.dmp' % self.e.host, 'wb') pickle.dump( lst , f) f.close() except Exception, info: print "Exception occured: %s" % info finally: if self.cli: self.cli.close() cols = ['filesystem', 'size', 'used', 'avail', 'capacity', 'mountpoint'] df_format = r'(?P<filesystem>\S+)\s+(?P<size>\S+)\s+(?P<used>\S+)\s+(?P<avail>\S+)\s+(?P<capacity>\S+)\s+(?P<mountpoint>\S+)' if __name__ == '__main__': import time for entry in monitored_hosts: dg = DataGatherer(entry) dg.start()
Спасибо.