การใช้คีย์ไฟล์ SSH กับ Fabric


100

คุณกำหนดค่าแฟบริกเพื่อเชื่อมต่อกับโฮสต์ระยะไกลโดยใช้คีย์ไฟล์ SSH ได้อย่างไร (ตัวอย่างเช่นอินสแตนซ์ Amazon EC2)

คำตอบ:


69

นอกจากนี้ยังควรกล่าวถึงที่นี่ว่าคุณสามารถใช้ args บรรทัดคำสั่งสำหรับสิ่งนี้:

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

150

การค้นหา fabfile ง่ายๆด้วยตัวอย่างการใช้งานการใช้งานคีย์ไฟล์ SSH ไม่ใช่เรื่องง่ายด้วยเหตุผลบางประการ ฉันเขียนบล็อกโพสต์เกี่ยวกับเรื่องนี้ ( พร้อมส่วนสำคัญที่ตรงกัน )

โดยทั่วไปการใช้งานจะมีลักษณะดังนี้:

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 รายการของคีย์อาจแก้ไขได้ นี่คือ fab 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 ทั้งหมดใน~/.ssh/configไฟล์ของคุณแล้ว 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

@dennis เรื่องนี้ยังคงเป็นประเด็นในปี 2559 .. ! ขอบคุณ!
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

อัปเดต:
สำหรับโฮสต์หลายโฮสต์ (โฮสต์เดียวจะทำเช่นกัน) คุณสามารถใช้สิ่งนี้:

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

7

ฉันต้องทำในวันนี้ไฟล์. py ของฉันง่ายที่สุดเหมือนที่โพสต์ไว้ในคำตอบของ @YuvalAdam แต่ฉันก็ยังคงได้รับแจ้งให้ใส่รหัสผ่าน ...

เมื่อดูบันทึกparamiko(ไลบรารีที่ใช้โดย fabric สำหรับ ssh) ฉันพบบรรทัด:

เพียร์ ssh ที่เข้ากันไม่ได้ (ไม่มีอัลกอริทึม kex ที่ยอมรับได้)

ฉันอัปเดตparamikoด้วย:

sudo pip install paramiko --upgrade

และตอนนี้ก็ใช้งานได้แล้ว


1

ตามที่ระบุไว้ข้างต้น Fabric จะรองรับการตั้งค่าไฟล์. ssh / config หลังจากแฟชั่น แต่การใช้ไฟล์ pem สำหรับ ec2 ดูเหมือนจะเป็นปัญหา IOW ไฟล์. ssh / config ที่ตั้งค่าอย่างถูกต้องจะทำงานจากบรรทัดคำสั่งผ่าน 'ssh servername' และไม่สามารถทำงานกับ 'fab something' เมื่อ env.host = ['servername']

สิ่งนี้เอาชนะได้โดยการระบุ env.key_filename = 'keyfile' ใน fabfile.py ของฉันและทำซ้ำรายการ IdentityFile ที่มีอยู่แล้วใน .ssh / config ของฉัน

นี่อาจเป็นได้ทั้ง 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.