Fabric使用時に〜/ .ssh / configにリストされているホストに接続する


83

にあるFabricホストを認識できないのに問題があります~/.ssh/config

fabfile.pyは次のとおりです。

from fabric.api import run, env

env.hosts = ['lulu']

def whoami():
    run('whoami')

実行$ fab whoamiすると:

[ルル]実行:whoami

致命的なエラー:luluの名前検索に失敗しました

名前luluは私の中にあります~/.ssh/config、このように:

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

これを解決するための私の最初の考えはlulu.lulu/etc/hosts(Macを使用している)のようなものを追加することですが、その後、IDファイルもFabricに渡す必要があります-そして、認証(つまり~/.ssh/config)をデプロイメントとは別にしたい(つまり)すなわちfabfile.py)。

同様に、ちなみに、hostsファイルでホストに接続しようとするとfabric.contrib.projects.rsync_projecthosts.envhosts.env = [lulu:2100]の呼び出しを使用してにrsync_project接続しようとしているように見えるlulu:21)の「ポート」を確認していないようです。

Fabricがこのlulu名前を認識しない理由はありますか?

回答:


145

バージョン1.4.0以降、Fabricはssh設定を(部分的に)使用します。ただし、明示的に有効にする必要があります。

env.use_ssh_config = True

fabfileの上部近くのどこかにあります。これを行うと、Fabricはssh設定を読み取る必要があります(~/.ssh/configデフォルトから、またはからenv.ssh_config_path)。

1つの警告:1.5.4より前のバージョンを使用している場合、env.use_ssh_configが設定されていても設定ファイルが存在しないとアボートが発生します。その場合、次のような回避策を使用できます。

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

回答は元々「受け入れられた回答は古くなっています」で始まりました[1.4.0より前の動作が文書化されているため]。私の答えが代わりに受け入れられたので、私はこの序文を削除しました;)ありがとう!
rbp 2012年

9

これは、名前がにない場合にも発生することに注意してください/etc/hosts。同じ問題が発生し、そのファイルとの両方にホスト名を追加する必要がありました~/.ssh/config


5

更新:この回答は現在古くなっています。


現在、Fabricは.ssh / configファイルをサポートしていません。これらを関数で設定して、CLIを呼び出すことができます。例:fab production task; ここで、productionはユーザー名、ホスト名、ポート、およびsshIDを設定します。

rsyncプロジェクトに関しては、ポート設定機能があるはずですが、そうでない場合は、いつでもlocal( "rsync ...")を実行できます。これは、基本的に、貢献した関数が行うことです。


1
env.key_filenameを秘密鍵のフルパスに設定します。また、問題が発生した場合は、この問題に関するいくつかの問題についてcode.fabfile.org/issues/show/265を参照してください。
tobych 2011

1
うん、今はサポートされている。(コメントしたときは1.0より前でしたが)後の読者のために注意してください。
モーガン

4

次のコードを使用して構成を読み取ることができます(元のコードはhttp://markpasc.typepad.com/blog/2010/04/loading-ssh-config-settings-for-fabric.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
ファブリック1.2+はsshライブラリ(paramikoフォーク)を使用します:try: \n from ssh.config import SSHConfig \n except ImportError: \n from paramiko.config import SSHConfig
jfs 2011

SSHライブラリはParamikoにマージされました。例from paramiko.config import SSHConfig
n8henrie 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.