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)?
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:
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_filename
biến môi trường để cấu hình Paramiko có thể tìm kiếm khi kết nối.
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.
settings
quả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
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/config
tệ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.
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=root
thay vì User = root
...
Đố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
staging
tác vụ này ?
Đố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"
env.user="ubuntu"
thay vì env.user=["ubuntu"]
.
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 paramiko
với:
sudo pip install paramiko --upgrade
Và bây giờ nó đang hoạt động.
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.
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....