1

我有这 30 台虚拟机,现在我正在手动完成所有操作,这对我来说是一种麻烦。我现在正在尝试编写一个脚本,以便我可以自动连接到它们并完成我想要的任务。我制作了一张我需要做的流程图。谁能给我一些关于我将如何以编程方式完成这项任务的提示。我附上流程图。
提前致谢。

在此处输入图像描述

请右键单击图像并单击查看图像以查看流程图。

4

3 回答 3

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是要走的路。authorized_keys使用每个远程主机上的 ssh 文件配置无密码登录。然后,您无需在主机列表中输入密码。

于 2012-12-26T11:59:11.840 回答
1

面料是您的最佳解决方案。Fabric 基于 paramiko(基于 libssh2),使得在远程主机上使用命令变得非常容易,并提供从远程主机上传和下载文件的功能。这是http://docs.fabfile.org/en/1.5/

put关于功能的文档在这里

于 2012-12-26T11:59:44.740 回答
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()
于 2012-12-26T12:00:18.533 回答