SSHキーファイル(Amazon EC2インスタンスなど)を使用してリモートホストに接続するようにファブリックを構成するにはどうすればよいですか?
ここで言及する価値があるのは、コマンドライン引数を使用できることです。
fab command -i /path/to/key.pem [-H [user@]Host[:port]]
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構成がそれを検索できるようになります。
Fabric 1.4で利用できるもう1つのクールな機能- FabricはSSH構成をサポートするようになりました 。
~/.ssh/config
ファイルにすべてのSSH接続パラメーターが既にある場合、Fabricはそれをネイティブにサポートします。必要なことは追加するだけです:
env.use_ssh_config = True
fabfileの先頭。
私にとって、以下はうまくいきませんでした:
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]"
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
今日はこれをしなければなりませんでした。私の.pyファイルは@YuvalAdamの回答に投稿されたもののように、可能な限りシンプルでしたが、それでもパスワードの入力を求められ続けました...
paramiko
(sshのファブリックで使用されるライブラリ)ログを見ると、次の行が見つかりました。
互換性のないsshピア(受け入れ可能なkexアルゴリズムなし)
paramiko
を以下で更新しました:
Sudo pip install paramiko --upgrade
そして今、それは機能しています。
前述のように、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でした。