Kết nối với máy chủ được liệt kê trong ~ / .ssh / config khi sử dụng Fabric


83

Tôi gặp sự cố khi Fabrickhông nhận dạng được các máy chủ mà tôi có trong đó ~/.ssh/config.

Của tôi fabfile.pynhư sau:

from fabric.api import run, env

env.hosts = ['lulu']

def whoami():
    run('whoami')

Chạy $ fab whoamimang lại:

[lulu] run: whoami

Lỗi nghiêm trọng: Tra cứu tên không thành công cho lulu

Tên lululà của tôi ~/.ssh/config, như thế này:

Host lulu
     hostname 192.168.100.100
     port 2100
     IdentityFile ~/.ssh/lulu-key

Suy nghĩ đầu tiên của tôi để giải quyết này là thêm một cái gì đó như lulu.luluđể /etc/hosts(Tôi đang trên một máy Mac), nhưng sau đó tôi cũng đã phải vượt qua trong các tập tin nhận dạng để Vải - và tôi thà giữ xác thực của tôi (ví dụ ~/.ssh/config) tách biệt với việc triển khai của tôi ( tức là fabfile.py).

Ngoài ra, tình cờ, nếu bạn cố gắng kết nối với một máy chủ trong tệp máy chủ, fabric.contrib.projects.rsync_projectdường như không xác nhận 'các cổng' trong hosts.env(tức là nếu bạn sử dụng hosts.env = [lulu:2100]lệnh gọi rsync_projectđể thử kết nối với lulu:21).

Có lý do gì mà Vải không nhận ra lulucái tên này ?

Câu trả lời:


145

Kể từ phiên bản 1.4.0, Fabric sử dụng cấu hình ssh của bạn (một phần). Tuy nhiên, bạn cần phải bật nó một cách rõ ràng, với

env.use_ssh_config = True

ở đâu đó gần đầu fabfile của bạn. Khi bạn làm điều này, Fabric sẽ đọc cấu hình ssh của bạn (từ ~/.ssh/configmặc định hoặc từ env.ssh_config_path).

Một cảnh báo: nếu bạn sử dụng phiên bản cũ hơn 1.5.4, việc hủy bỏ sẽ xảy ra nếu env.use_ssh_configđược đặt nhưng không có tệp cấu hình. Trong trường hợp đó, bạn có thể sử dụng một giải pháp khác như:

if env.ssh_config_path and os.path.isfile(os.path.expanduser(env.ssh_config_path)):
    env.use_ssh_config = True

Câu trả lời ban đầu bắt đầu bằng "Câu trả lời được chấp nhận đã lỗi thời" [vì nó đã ghi lại hành vi trước 1.4.0]. Tôi đã xóa lời nói đầu này, vì câu trả lời của tôi đã được chấp nhận;) Cảm ơn!
rbp

9

Lưu ý rằng điều này cũng xảy ra khi không có tên /etc/hosts. Tôi đã gặp sự cố tương tự và phải thêm tên máy chủ vào cả tệp đó và ~/.ssh/config.


5

cập nhật : Câu trả lời này hiện đã lỗi thời .


Hiện tại, Fabric không hỗ trợ tệp .ssh / config. Bạn có thể thiết lập chúng trong một hàm để sau đó gọi cli, ví dụ: fab production task; nơi sản xuất đặt tên người dùng, tên máy chủ, cổng và danh tính ssh.

Đối với dự án rsync, bây giờ sẽ có khả năng thiết lập cổng, nếu không, bạn luôn có thể chạy cục bộ ("rsync ...") vì đó về cơ bản là chức năng đóng góp đó.


1
Đặt env.key_filename thành đường dẫn đầy đủ của khóa cá nhân. Ngoài ra, nếu bạn gặp sự cố, hãy xem code.fabfile.org/issues/show/265 để biết một số vấn đề xung quanh vấn đề này.
tobych

1
Đúng, nó đã được hỗ trợ ngay bây giờ. (mặc dù nó là trước 1.0 khi tôi nhận xét) Lưu ý cho những người đọc sau.
Morgan

4

Người ta có thể sử dụng mã sau để đọc cấu hình (mã gốc được lấy từ: http://markpasc.typepad.com/blog/2010/04/loading-ssh-config-settings-for-fainst.html ):

from fabric.api import *
env.hosts = ['servername']

def _annotate_hosts_with_ssh_config_info():
    from os.path import expanduser
    from paramiko.config import SSHConfig

    def hostinfo(host, config):
        hive = config.lookup(host)
        if 'hostname' in hive:
            host = hive['hostname']
        if 'user' in hive:
            host = '%s@%s' % (hive['user'], host)
        if 'port' in hive:
            host = '%s:%s' % (host, hive['port'])
        return host

    try:
        config_file = file(expanduser('~/.ssh/config'))
    except IOError:
        pass
    else:
        config = SSHConfig()
        config.parse(config_file)
        keys = [config.lookup(host).get('identityfile', None)
            for host in env.hosts]
        env.key_filename = [expanduser(key) for key in keys if key is not None]
        env.hosts = [hostinfo(host, config) for host in env.hosts]

        for role, rolehosts in env.roledefs.items():
            env.roledefs[role] = [hostinfo(host, config) for host in rolehosts]

_annotate_hosts_with_ssh_config_info()

1
vải 1.2+ sử dụng sshthư viện ( paramikongã ba):try: \n from ssh.config import SSHConfig \n except ImportError: \n from paramiko.config import SSHConfig
JFS

Thư viện SSH đã được sáp nhập trở lại vào paramiko, ví dụ:from paramiko.config import SSHConfig
n8henrie
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.