Запуск python скрипта на удалённом сервере в фоновом режиме
Есть сервер_А, есть несколько других серверов (host_1, host_2, host_3). Необходимо запустить с сервер_А скрипт который пройдёт по всем другим серверам и запустит скрипт в фоне с параметрами,так чтобы не ждать возврата данных с каждого хоста.
from paramiko import SSHClient, AutoAddPolicy
def get_cmd_out(cmd, host, ssh_log, ssh_key):
with SSHClient() as ssh:
ssh.set_missing_host_key_policy(AutoAddPolicy())
ssh.connect(host, username=ssh_log, key_filename=ssh_key)
_,stdout, __ =ssh.exec_command(cmd)
result = stdout.read()
out = result.decode('866')
return out
ssh_log = 'tester'
ssh_key = '/some/key.pub'
hosts = ['host_1','host_2','host_3']
python_venv = '/path/to/venv/bin/python3'
script_path = '/path/to/script.py'
params = '--some params'
cmd = f'{python_venv} {script_path} {params}'
for host in hosts:
result = get_cmd_out(cmd, host, ssh_log, ssh_key)
Как правильно написать cmd чтобы оно не ждало возвращения вывода команды с каждого хоста, а передало в работу и пошло передавать команду следующему хосту?
Ответы (1 шт):
Автор решения: eri
→ Ссылка
from paramiko import SSHClient, AutoAddPolicy
def get_cmd_start(cmd, host, ssh_log, ssh_key):
ssh = SSHClient()
ssh.set_missing_host_key_policy(AutoAddPolicy())
ssh.connect(host, username=ssh_log, key_filename=ssh_key)
return ssh, ssh.exec_command(cmd)
def get_cmd_out(ssh, stdin,stdout,stderr):
result = stdout.read()
out = result.decode('866')
ssh.close()
return out
ssh_log = 'tester'
ssh_key = '/some/key.pub'
hosts = ['host_1','host_2','host_3']
python_venv = '/path/to/venv/bin/python3'
script_path = '/path/to/script.py'
params = '--some params'
cmd = f'{python_venv} {script_path} {params}'
connections = []
for host in hosts:
ssh, pipes = get_cmd_start(cmd, host, ssh_log, ssh_key)
connections.append([ssh, *pipes ])
for con in connections:
out = get_cmd_out(*con)
Разбить функцию на две. Сначала стартуешь на всех хостах - потом забираешь результат