Answers:
由于某种原因,要找到一个简单的fabfile以及一个使用SSH密钥文件的有效示例并不容易。我写了一篇有关它的博客文章(带有匹配的要点)。
基本上,用法是这样的:
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配置在连接时可以查找它。
env.key_filename
可以包含一个字符串列表,以尝试连接的多个密钥文件。
settings
上下文管理器的一项任务中以编程方式设置了密钥,直到我更改key_filename='/path/to/key'
为,否则无法识别key_filename=['/path/to/key']
密钥文件名,因此,如果其他任何人遇到麻烦,请将密钥文件名列为密钥列表可能会解决该问题。这是fab 1.10.1和
从Fabric 1.4开始提供的另一个很酷的功能-Fabric现在支持SSH配置。
如果您的文件中已经包含所有SSH连接参数~/.ssh/config
,Fabric将本地支持它,您只需添加:
env.use_ssh_config = True
在fabfile的开头。
IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'
或者Login password for ' root':
只是确保您的中没有空格.ssh/config
。例如,User=root
而不是User = root
...
对于fabfile中的fabric2,请使用以下命令:
from fabric import task, Connection
@task
def staging(ctx):
ctx.name = 'staging'
ctx.user = 'ubuntu'
ctx.host = '192.1.1.1'
ctx.connect_kwargs.key_filename = os.environ['ENV_VAR_POINTS_TO_PRIVATE_KEY_PATH']
@task
def do_something_remote(ctx):
with Connection(ctx.host, ctx.user, connect_kwargs=ctx.connect_kwargs) as conn:
conn.sudo('supervisorctl status')
并运行:
fab staging do_something_remote
更新:
对于多个主机(一个主机也可以),您可以使用以下命令:
from fabric2 import task, SerialGroup
@task
def staging(ctx):
conns = SerialGroup(
'user@10.0.0.1',
'user@10.0.0.2',
connect_kwargs=
{
'key_filename': os.environ['PRIVATE_KEY_TO_HOST']
})
ctx.CONNS = conns
ctx.APP_SERVICE_NAME = 'google'
@task
def stop(ctx):
for conn in ctx.CONNS:
conn.sudo('supervisorctl stop ' + ctx.APP_SERVICE_NAME)
并使用fab或fab2运行它:
fab staging stop
staging
任务中支持多个主机?
对我来说,以下方法无效:
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 [user@]host[:port]]
但是,执行以下操作:
env.key_filename=['keyfile.pem']
env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]
要么
env.key_filename=['keyfileq.pem']
env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"
env.user="ubuntu"
代替,则第一个示例对我有用env.user=["ubuntu"]
。
如上所述,Fabric将在某种形式之后支持.ssh / config文件设置,但是将pem文件用于ec2似乎是有问题的。IOW一个正确设置的.ssh / config文件将通过“ ssh服务器名”从命令行运行,并且当env.host = ['服务器名']时无法与“ fab sometask”一起工作。
通过在我的fabfile.py中指定env.key_filename ='keyfile'并复制我的.ssh / config中已经存在的IdentityFile条目,可以解决此问题。
这可以是Fabric或paramiko,在我的情况下是Fabric 1.5.3和Paramiko 1.9.0。
这些答案对py3.7,fabric2.5.0和paramiko 2.7.1都不起作用。
但是,使用文档中的PKey属性确实可以:http ://docs.fabfile.org/en/2.5/concepts/authentication.html#private-key-objects
from paramiko import RSAKey
ctx.connect_kwargs.pkey = RSAKey.from_private_key_file('path_to_your_aws_key')
with Connection(ctx.host, user, connect_kwargs=ctx.connect_kwargs) as conn:
//etc....