作为库使用

从文档中我们可以看出,Fabric 最主要的应用场景是通过 fab 命令来引用 fabfile ,然而 Fabric 的内部实现在保证它在不使用 fab 和 fabfile 的场合也非常易于使用——本文档将会详细向你介绍。

此外还有写需要时刻谨记的事情,比如:编写好 fabfile ,运行 fab 命令时是怎样创建并断开连接的。

连接服务器

前面我们已经介绍过 Fabric 是怎样连接主机的,不过仍有些知识埋藏在 运行 文档中,具体来说你可能需要快速浏览一遍 Connections 章节的文档。(虽然不必要,但我强烈建议你把整个文档都快速浏览一遍。)

如那些章节中所提到的, runsudo 这样的操作在连接时都会查看同一处设置: env.host_string 。其它设置主机列表的机制都用于 fab 命令,和作为 Python 库使用没有关系。

也就是说,在 Fabric 1.3 中,如果你想要结合任务 X 和主机列表 Y ,可以使用 execute ,就像这样: execute(X, hosts=Y) ,详细介绍请访问 execute 文档——手动操作主机列表功能真的很有必要。

断开连接

fab 所做另一件重要的事是,会在会话结束的时候断开所有连接,否则 Python 程序将永远等待网络资源的释放。

在 Fabric 0.9.4 或更新版本中,你可以使用这个函数方便地实现这个功能: disconnect_all ,只需要保证程序结束的时候调用该方法(通常在 try: finally 表达式中,以防意外的错误导致无法释放连接)即可。

如果你使用的是 Fabric 0.9.3 或更早之前的版本,你可以这样做( disconnect_all 仅仅提供了更好看的输出):

from fabric.state import connections

for key in connections.keys():
    connections[key].close()
    del connections[key]

最后注意

本文档只是个草案,因此并不会详细覆盖作为 Fabric 库导入与使用 fab 命令之间的全部区别,不过上面已经列出了其中最需要注意的陷阱。在不确定如何使用时,可以参考 Fabric 源代码中 fabric/main.py 部分,fab 命令的实现主要在这里,相信会是很有用的参考。