web-dev-qa-db-ja.com

FabricでSSHキーファイルを使用する

SSHキーファイル(Amazon EC2インスタンスなど)を使用してリモートホストに接続するようにファブリックを構成するにはどうすればよいですか?

94
Yuval Adam

ここで言及する価値があるのは、コマンドライン引数を使用できることです。

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

SSHキーファイルの使用例が記載された単純なfabfileを見つけることは、何らかの理由で簡単ではありません。私は ブログ投稿 について書きました( 一致するGist )。

基本的に、使用方法は次のようになります。

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構成がそれを検索できるようになります。

145
Yuval Adam

Fabric 1.4で利用できるもう1つのクールな機能- FabricはSSH構成をサポートするようになりました

~/.ssh/configファイルにすべてのSSH接続パラメーターが既にある場合、Fabricはそれをネイティブにサポートします。必要なことは追加するだけです:

env.use_ssh_config = True

fabfileの先頭。

64
Yuval Adam

私にとって、以下はうまくいきませんでした:

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=["[email protected]"]

または

env.key_filename=['keyfileq.pem']
env.Host_string="[email protected]"
15

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

更新:
複数のホストの場合(1つのホストでも可能)、これを使用できます。

from fabric2 import task, SerialGroup

@task
def staging(ctx):
    conns = SerialGroup(
        '[email protected]',
        '[email protected]',
        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
12
MikeL

今日はこれをしなければなりませんでした。私の.pyファイルは@YuvalAdamの回答に投稿されたもののように、可能な限りシンプルでしたが、それでもパスワードの入力を求められ続けました...

paramiko(sshのファブリックで使用されるライブラリ)ログを見ると、次の行が見つかりました。

互換性のないsshピア(受け入れ可能なkexアルゴリズムなし)

paramikoを以下で更新しました:

Sudo pip install paramiko --upgrade

そして今、それは機能しています。

7
flagg19

前述のように、Fabricはファッション後の.ssh/configファイル設定をサポートしますが、ec2にpemファイルを使用することには問題があるようです。 IOWが適切にセットアップされた.ssh/configファイルは、コマンドラインから「ssh servername」を介して機能し、env.Host = ['servername']の場合は「fab sometask」で機能しません。

これは、fabfile.pyでenv.key_filename = 'keyfile'を指定し、すでに.ssh/configにあるIdentityFileエントリを複製することで克服されました。

これは、Fabricまたはparamikoのいずれかであり、私の場合はFabric 1.5.3およびParamiko 1.9.0でした。

1
Jeff Doran