Fabric 2.0.1中env的替代方案及旧版本密钥配置迁移问题
在Fabric 2.0.1中指定私钥文件的方法
哦,Fabric 2.x和1.x的API差异确实不小,我当初从1.8.x切换到2.x的时候也碰到过这个问题!原来Fabric 1里的env.key_filename在2.x里已经不能直接用了,得换下面几种方式来实现相同的功能:
方法1:在创建Connection对象时直接指定
Fabric 2.x基于Paramiko,所以可以通过connect_kwargs参数把私钥路径传给连接对象:
from fabric import Connection # 直接在Connection里指定私钥文件 conn = Connection( host="你的目标主机地址", user="你的用户名", connect_kwargs={"key_filename": "/etc/appliance/fabric/id_rsa"} )
这样每次创建连接时都会使用你指定的私钥文件。
方法2:通过Config对象统一配置
如果你的脚本里有多个Connection实例,或者想把配置集中管理,可以用Fabric的Config对象来全局设置:
from fabric import Config, Connection # 创建配置对象,覆盖连接参数 config = Config( overrides={ "connect_kwargs": { "key_filename": "/etc/appliance/fabric/id_rsa" } } ) # 后续创建Connection时传入这个config conn = Connection(host="你的目标主机地址", user="你的用户名", config=config)
关于命令行-i选项无效的问题
你提到用fab命令的-i选项没起作用,大概率是这两个原因:
- 命令格式不对:Fabric 2.x的
-i参数要放在任务名称前面,正确的命令格式是:fab -i /etc/appliance/fabric/id_rsa 你的任务名称 - 代码里的配置覆盖了命令行参数:如果你的脚本里已经显式在
Connection或Config中指定了key_filename,命令行的-i参数会被代码里的配置覆盖。这种情况下,要么去掉代码里的硬编码,要么优先读取命令行传入的参数。
简单来说,Fabric 2.x把原来1.x里的env配置拆分成了更灵活的Config和connect_kwargs,核心是通过Paramiko的连接参数来传递私钥信息~
内容的提问来源于stack exchange,提问作者Anjana Shivangi
相关产品推荐
相关产品推荐

