Sử dụng tệp khóa SSH với Vải


100

Làm cách nào để bạn định cấu hình vải để kết nối với máy chủ từ xa bằng cách sử dụng tệp khóa SSH (ví dụ: phiên bản Amazon EC2)?

Câu trả lời:


69

Cũng đáng nói ở đây là bạn có thể sử dụng args dòng lệnh cho việc này:

fab command -i /path/to/key.pem [-H [user@]host[:port]]

150

Vì một số lý do, việc tìm kiếm một tệp fabfile đơn giản với một ví dụ hoạt động về cách sử dụng tệp khóa SSH là không dễ dàng. Tôi đã viết một bài đăng trên blog về nó ( với ý chính phù hợp ).

Về cơ bản, cách sử dụng diễn ra như sau:

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')

Phần quan trọng là thiết lập env.key_filenamebiến môi trường để cấu hình Paramiko có thể tìm kiếm khi kết nối.


4
trong thực tế, đây là câu trả lời tốt hơn.
panchicore

3
env.key_filename có thể chứa một danh sách các chuỗi để thử nhiều tập tin khóa cho một kết nối.
Carl G

Tôi đang đặt khóa theo chương trình trong một trong các tác vụ của mình bằng trình settingsquản lý ngữ cảnh và không thể làm cho nó nhận ra key_filename cho đến khi tôi đổi key_filename='/path/to/key'thành key_filename=['/path/to/key']vì vậy nếu bất kỳ ai khác gặp sự cố, việc đặt key_filename thành danh sách các khóa có thể khắc phục sự cố. Đây là với fab 1.10.1 và Paramiko 1.15.2
Jaymon

2
@AseemHegshetye, Nó đã bị xóa trong Vải mới nhất 2. Câu trả lời này dành cho Vải 1.
Iulian Onofrei

1
Tôi muốn nhập khẩu rõ ràng thay vì nhập khẩu *
mit

64

Một tính năng thú vị khác có sẵn từ Fabric 1.4 - Fabric hiện hỗ trợ cấu hình SSH .

Nếu bạn đã có tất cả các tham số kết nối SSH trong ~/.ssh/configtệp của mình , thì Fabric sẽ hỗ trợ nó, tất cả những gì bạn cần làm là thêm:

env.use_ssh_config = True

ở đầu fabfile của bạn.


2
Rất hữu ích! Nếu bạn gặp phải các lỗi như IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'hoặc Login password for ' root':chỉ cần đảm bảo rằng bạn không có khoảng trắng trong của bạn .ssh/config. Đó là ví dụ User=rootthay vì User = root...
dennis

@dennis Đây dường như vẫn là một vấn đề trong năm 2016 ..! Cảm ơn!
gabn88

17

Đối với vải2 trong fabfile, hãy sử dụng như sau:

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')

và chạy nó với:

fab staging do_something_remote

CẬP NHẬT:
Đối với nhiều máy chủ (cũng có một máy chủ), bạn có thể sử dụng điều này:

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)

và chạy nó với fab hoặc fab2:

fab staging stop

1
Đây là cách đúng để làm trong vải 2.x, vì tất cả các câu trả lời khác sẽ không hoạt động.
Vivek Aditya

Làm thế nào để hỗ trợ nhiều máy chủ trong stagingtác vụ này ?
Black_Rider

1
@Black_Rider, đã thêm nó vào câu trả lời của tôi
MikeL

15

Đối với tôi, những điều sau đây không hoạt động:

env.user=["ubuntu"]
env.key_filename=['keyfile.pem']
env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"]

hoặc là

fab command -i /path/to/key.pem [-H [user@]host[:port]]

Tuy nhiên, những điều sau đã làm:

env.key_filename=['keyfile.pem']
env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]

hoặc là

env.key_filename=['keyfileq.pem']
env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"

3
Ví dụ đầu tiên của bạn phù hợp với tôi nếu bạn sử dụng env.user="ubuntu"thay vì env.user=["ubuntu"].
Taylor Edmiston

7

Tôi đã phải làm điều này hôm nay, tệp .py của tôi càng đơn giản càng tốt, giống như tệp được đăng trong câu trả lời của @YuvalAdam nhưng tôi vẫn tiếp tục nhận được nhắc nhập mật khẩu ...

Nhìn vào nhật ký paramiko(thư viện được sử dụng bởi vải cho ssh), tôi tìm thấy dòng:

Đồng đẳng ssh không tương thích (không có thuật toán kex được chấp nhận)

Tôi đã cập nhật paramikovới:

sudo pip install paramiko --upgrade

Và bây giờ nó đang hoạt động.


1

Như đã nêu ở trên, Fabric sẽ hỗ trợ cài đặt tệp .ssh / config sau một thời gian, nhưng việc sử dụng tệp pem cho ec2 dường như có vấn đề. IOW một tệp .ssh / config được thiết lập đúng cách sẽ hoạt động từ dòng lệnh thông qua 'ssh servername' và không hoạt động với 'fab sometask' khi env.host = ['servername'].

Điều này đã được khắc phục bằng cách chỉ định env.key_filename = 'keyfile' trong fabfile.py của tôi và sao chép mục nhập IdentityFile đã có trong .ssh / config của tôi.

Đây có thể là Vải hoặc paramiko, trong trường hợp của tôi là Vải 1.5.3 và Paramiko 1.9.0.


1

Không câu trả lời nào trong số này phù hợp với tôi trên py3.7, Fabric2.5.0 và paramiko 2.7.1.

Tuy nhiên, việc sử dụng thuộc tính PKey trong tài liệu có hiệu quả: http://docs.fabfile.org/en/2.5/concept/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.... 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.