结合使用SSH密钥文件
寻找一个简单的fabfile与SSH密钥文件的使用的工作示例是不容易的,出于某种原因。我写了一个关于它的blog post(with a matching gist)。
基本上,用法是这样的:
from fabric.api import *
env.hosts = ['host.name.com']
env.user = 'user'
env.key_filename = '/path/to/keyfile.pem'
def local_uname():
local('uname -a')
def remote_uname():
run('uname -a')
的重要组成部分,是设置env.key_filename
环境变量,使连接时的paramiko配置可以寻找它。
另一个很酷的功能可作为面料1.4 - Fabric now supports SSH configs。
如果你已经拥有所有你~/.ssh/config
文件中的SSH连接参数,面料会原生支持它,所有你需要做的就是添加:
env.use_ssh_config = True
你fabfile的开始。
如上所述,Fabric将在时尚后支持.ssh/config文件设置,但使用ec2的pem文件似乎有问题。 IOW在env.host = ['servername']时,正确设置.ssh/config文件将通过'ssh servername'从命令行工作,并且无法与'fab sometask'一起工作。
这是通过指定我的fabfile.py中的env.key_filename ='keyfile'并且复制已在我的.ssh/config中的IdentityFile条目来克服的。
这可能是Fabric或paramiko,在我的例子中是Fabric 1.5.3和Paramiko 1.9.0。
对于我来说,下面没有工作:
env.user=["ubuntu"]
env.key_filename=['keyfile.pem']
env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"]
或
fab command -i /path/to/key.pem [-H [[email protected]]host[:port]]
但是,以下做:
env.key_filename=['keyfile.pem']
env.hosts=["[email protected]"]
或
env.key_filename=['keyfileq.pem']
env.host_string="[email protected]"
如果您使用'env.user =“ubuntu”'而不是'env.user = [“ubuntu”]'',您的第一个示例适用于我。 – 2016-04-20 19:58:13
我不得不这样做。今天,我.py文件是尽可能的简单,就像在@YuvalAdam的答案张贴的一个,但仍然我一直得到提示输入密码......
在paramiko
展望(通过面料SSH使用的库)的日志,我发现了一行:
Incompatible ssh peer (no acceptable kex algorithm)
我更新paramiko
有:
sudo pip install paramiko --upgrade
而现在它的工作。
在练习中这是更好的答案。 – panchicore 2012-10-31 20:17:57
'env.key_filename' [可以包含字符串列表](http://docs.fabfile.org/en/latest/usage/env.html#key-filename)为连接尝试多个密钥文件。 – 2014-04-22 12:29:14
我正在使用'settings'上下文管理器在我的一个任务中以编程方式设置密钥,直到我将'key_filename ='/ path/to/key''更改为'key_filename = ['/path/to/key']'如果其他人遇到问题,使key_filename成为密钥列表可能会修复它。这是与晶圆厂1.10.1和帕拉米科1.15.2 – Jaymon 2015-05-05 00:04:15