ファブリックでのSSHキーファイルの使用


100

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

回答:


69

また、ここでコマンドライン引数を使用できることにも言及する価値があります。

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

150

SSH鍵ファイルの使用例を使用して単純なfabfileを見つけることは、何らかの理由で簡単ではありません。私はそれについてブログ記事を書きました(一致する要点を付けて)。

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

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構成が検索できるように、環境変数を設定することです。


4
実際には、これがより良い答えです。
panchicore、

3
env.key_filename 接続に複数のキーファイルを試すための文字列のリストを含めることができます
カールG 14

私はsettingsコンテキストマネージャーを使用してタスクの1つでプログラムでキーを設定していましたが、他の誰かが問題を抱えkey_filename='/path/to/key'key_filename=['/path/to/key']いる場合に変更するまでkey_filenameを認識できませんでした。これは、FAB 1.10.1と1.15.2 Paramikoである
Jaymon

2
@AseemHegshetye、これは最新で削除されたファブリック2.この答えは、生地1のためである
イウリアンOnofrei

1
インポートではなく、明示的なインポートを希望します*
mit

64

ファブリック1.4以降で利用可能なもう1つの優れた機能- ファブリックはSSH構成をサポートするようになりました

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

env.use_ssh_config = True

あなたのfabfileの始めに。


2
非常に便利!のようなエラーが発生した場合IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'Login password for ' root':、に空白がないことを確認してください.ssh/config。それは、たとえば...のUser=root代わりにUser = root
デニス

@dennisこれはまだ2016年の問題のようです。ありがとう!
gabn88

17

以下のためのfabric2 fabfile使用に次の:

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

fabまたはfab2で実行します。

fab staging stop

1
他のすべての答えが機能しないため、これはファブリック2.xで行う正しい方法です。
Vivek Aditya

このstagingタスクで複数のホストをサポートするにはどうすればよいですか?
Black_Rider

1
@Black_Rider、それを私の答えに追加しました
MikeL

15

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

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=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]

または

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

3
env.user="ubuntu"代わりにを使用すると、最初の例が機能しますenv.user=["ubuntu"]
テイラーエドミストン

7

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

見るとparamiko、ログ(SSH用ファブリックで使用されるライブラリー)、私はラインを見つけました:

互換性のないsshピア(許容できるkexアルゴリズムはありません)

私は次のように更新paramikoしました:

sudo pip install paramiko --upgrade

そして今それは働いています。


1

上記のように、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

py3.7、fabric2.5.0、およびparamiko 2.7.1では、これらの回答はどれも機能しませんでした。

しかし、ドキュメントのPKEY属性を使用して作業を行います。http://docs.fabfile.org/en/2.5/concepts/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.... 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.