我编写了一个脚本,用于从文件中读取服务器名称,从其他文件中读取命令名称,并在所有服务器上运行所有命令并打印输出。
import os, paramiko
cmdlist =[]
with open('command.txt') as f:
for line in f:
cmdlist.append(line.rstrip())
with open('server.txt') as f:
for line in f:
server = line.rstrip()
username, password = ('root', 'password')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, timeout=60)
print "For Server " + server
for y in cmdlist:
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(y)
output1 = ssh_stdout.read()
print ">", output1.rstrip()
ssh.close()
问题是循环的第二个顺序运行,因此需要花费太多时间。服务器的顺序并不重要。我希望我的脚本在所有服务器上并行运行命令,然后在文件中编译。
我试过这样的事情。我将上面的代码放在一个名为" fast_process"的函数中。并编写如下代码:
if __name__ == '__main__':
pool = Pool()
pool.map(fast_process)
但这似乎是问我更多的论点,但我的功能不会引起任何争论。我该怎么办?
答案 0 :(得分:1)
map
是一个函数,它接受一个函数,一个序列并将一个函数应用于一个序列的每个元素(简化一个python版本的map)
所以你需要的是创建一系列服务器并将功能应用于它们。
import os, paramiko
with open('command.txt') as f:
commands = tuple(line.rstrip() for line in f)
with open('server.txt') as f:
servers = tuple(line.rstrip() for line in f)
username, password = 'username', 'password'
pool = Pool()
def exec_commands(server):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()),
ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
ssh.connect(server, username=username, timeout=60)
for cmd in commands:
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)
output = ssh_stdout.read()
print('>', output.rstrip())
ssh.close()
pool.map(exec_command, servers)