Fabric에서 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 연결에 여러 키 파일을 시도하는 문자열 목록을 포함 할 수 있습니다 .
Carl G

settings컨텍스트 관리자를 사용하여 내 작업 중 하나에서 프로그래밍 방식으로 키를 설정하고 있었는데 다른 사람이 문제가있는 경우 key_filename을 키 목록으로 만들면 문제를 해결할 key_filename='/path/to/key'key_filename=['/path/to/key']있도록 변경 될 때까지 key_filename을 인식하지 못했습니다 . 팹 1.10.1 및 Paramiko 1.15.2
Jaymon

2
@AseemHegshetye, 최신 Fabric 2에서 제거되었습니다.이 답변은 Fabric 1에 대한 것입니다.
Iulian Onofrei

1
나는 수입 대신 명시적인 수입을 선호한다 *
mit

64

Fabric 1.4에서 사용할 수있는 또 다른 멋진 기능 -Fabric은 이제 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':.NET Framework에 공백이 없는지 확인하십시오 .ssh/config. 예를 들어 User=root대신 User = root...
dennis

@dennis 이것은 2016 년에도 여전히 문제인 것 같습니다 ..! 감사!
gabn88 2016

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

업데이트 :
여러 호스트의 경우 (한 호스트도 수행) 다음을 사용할 수 있습니다.

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
이것은 fabric 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"].
Taylor Edmiston 2016

7

오늘이 작업을 수행해야했습니다. 내 .py 파일은 @YuvalAdam의 답변에 게시 된 파일처럼 가능한 한 간단했지만 여전히 암호를 입력하라는 메시지가 계속 표시됩니다.

상기 찾고 paramiko로그 (ssh를위한 직물에 사용되는 라이브러리), I 라인을 발견 :

호환되지 않는 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이었습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.