我有这 30 台虚拟机,现在我正在手动完成所有操作,这对我来说是一种麻烦。我现在正在尝试编写一个脚本,以便我可以自动连接到它们并完成我想要的任务。我制作了一张我需要做的流程图。谁能给我一些关于我将如何以编程方式完成这项任务的提示。我附上流程图。
提前致谢。
请右键单击图像并单击查看图像以查看流程图。
读取文本文件并获取数据很简单:
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
是要走的路。authorized_keys
使用每个远程主机上的 ssh 文件配置无密码登录。然后,您无需在主机列表中输入密码。
面料是您的最佳解决方案。Fabric 基于 paramiko(基于 libssh2),使得在远程主机上使用命令变得非常容易,并提供从远程主机上传和下载文件的功能。这是http://docs.fabfile.org/en/1.5/
put
关于功能的文档在这里
我没有在流程图中得到您的问题,但是您可以按照建议使用 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()