我有这30台虚拟机,我现在正在手动完成所有操作,这对我来说是一种麻烦。我现在正在尝试编写一个脚本,以便我可以自动连接到它们并完成我想要的任务。我制作了一个我需要做的流程图。任何人都可以给我一些关于如何以编程方式完成此任务的提示。我附上了流程图。
提前致谢。
请右键单击图像,然后单击查看图像以查看流程图。
答案 0 :(得分:4)
阅读文本文件并获取数据非常简单:
with open('host.txt', 'r') as inf:
lines = inf.readlines()
hostlist = [ln.split() for ln in lines]
现在hostlist
应该是列表清单;
[['192.168.0.23', 'root', 'secret'], ['192.168.0.24', 'root', 'secret2'] ...
但是您的列表不应包含多于主机名。 IP地址可以从您必须配置的DNS中获取,如果配置正确,ssh可以在没有密码的情况下登录。
将所有虚拟主机的密码放在纯文本文件中存在安全问题。如果您想要走这条路线,请务必限制对该文件的访问!
您可以使用subprocess
执行命令。我建议使用rsync
将所需文件推送到虚拟机。这最小化了网络流量。您可以直接从文件系统部署到文件系统,而无需滚动tarball。它可以像
status = subprocess.check_output(['rsync', '-av', localdir, remotedir])
其中localdir
是存储相关虚拟机文件的目录(它应以'/'结尾),而'remotedir'是虚拟机上的hostname::directory
数据应该着陆(这应该不以'/'结尾。
为了远程执行命令,ssh
是可行的方法。配置无密码登录,使用每个远程主机上的ssh的authorized_keys
文件。然后,您不需要将密码放在主机列表中。
答案 1 :(得分:1)
Fabric是您的最佳解决方案。基于paramiko(基于libssh2)的Fabric,它可以很容易地在远程主机上使用命令,并提供从远程主机上传和下载fiels的功能。 这是http://docs.fabfile.org/en/1.5/
关于put
函数here
答案 2 :(得分:1)
我没有在流程图中提出您的问题,但您可以按照建议使用paramiko,并且我在paramiko之上编写了大量后台实用程序,这使得支持人员可以在浏览器上监视远程Web服务器。下面的代码段,
client = paramiko.SSHClient()
client.set_missing_host_key_policy( paramiko.AutoAddPolicy() )
client.load_system_host_keys()
client.connect( '192.168.100.1', port=4001, username='monitor', password='XXXX' )
cmds = [ "sed -i 's/\/bin\/date -u/\/bin\/date/g' /etc/cron.hourly/reboot" ]
for cmd in cmds:
if __DEBUG_MODE__:
print 'Executing..... ' + cmd
stdin, stdout, stderr = client.exec_command( cmd )
另外,如果你想推送下面的文件是片段,
def setupSFTPClient(self, ip_add):
print 'Setting SFTP client: ' + ip_add
tb = 'Finished SFTP-ing. '
try:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.load_system_host_keys()
client.connect(ip_add, port=4001, username='monitor', password='XXXX')
sftp_client = client.open_sftp()
# NB you need the filename for remote path otherwise
# paramiko barfs with IOError: Failure
sftp_client.put( '/home/projects/portal_release.tgz', '/var/ND/portal_release.tgz' )
sftp_client.put( '/home/projects/portal_installer.sh', '/var/ND/portal_installer.sh' )
sftp_client.close()
except Exception, e:
print e
tb = traceback.format_exc()
finally:
print tb
client.close()