Yapıyı SSH anahtar dosyaları (örneğin, Amazon EC2 bulut sunucuları) kullanarak uzak ana bilgisayarlara bağlanacak şekilde nasıl yapılandırırsınız?
Yapıyı SSH anahtar dosyaları (örneğin, Amazon EC2 bulut sunucuları) kullanarak uzak ana bilgisayarlara bağlanacak şekilde nasıl yapılandırırsınız?
Yanıtlar:
Çalışan bir SSH anahtar dosyası kullanım örneğiyle basit bir fabfile bulmak bazı nedenlerden dolayı kolay değildir. Bununla ilgili bir blog yazısı yazdım ( eşleşen bir özetle ).
Temel olarak, kullanım şuna benzer:
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')
Önemli kısım, env.key_filename
ortam değişkenini ayarlamaktır , böylece Paramiko konfigürasyonu bağlanırken onu arayabilir.
env.key_filename
bir bağlantı için birden çok anahtar dosyası denemek için bir dizi listesi içerebilir .
settings
bağlam yöneticisi ve değiştim kadar key_filename tanımak için alınamadı key_filename='/path/to/key'
için key_filename=['/path/to/key']
öylesine başkasının bu belayı düzeltmek olabilir key_filename anahtarların bir listesini yapıyor eğer. Bu fab 1.10.1 ve Paramiko 1.15.2 ile
Fabric 1.4'ten itibaren sunulan başka bir harika özellik - Fabric artık SSH yapılandırmalarını destekliyor .
~/.ssh/config
Dosyanızda tüm SSH bağlantı parametrelerine zaten sahipseniz , Fabric bunu yerel olarak destekleyecektir, yapmanız gereken tek şey eklemek:
env.use_ssh_config = True
fabfile dosyanızın başında.
IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'
veya Login password for ' root':
yalnızca .ssh/config
. Örneğin, User=root
yerine User = root
...
İçin fabric2 fabfile kullanımda şu içinde:
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')
ve şununla çalıştırın:
fab staging do_something_remote
GÜNCELLEME:
Birden çok ana bilgisayar için (bir ana bilgisayar da yapacaktır) bunu kullanabilirsiniz:
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)
ve fab veya fab2 ile çalıştırın:
fab staging stop
staging
görevde birden çok ana bilgisayar nasıl desteklenir ?
Benim için aşağıdakiler işe yaramadı:
env.user=["ubuntu"]
env.key_filename=['keyfile.pem']
env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"]
veya
fab command -i /path/to/key.pem [-H [user@]host[:port]]
Ancak aşağıdakiler yapıldı:
env.key_filename=['keyfile.pem']
env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]
veya
env.key_filename=['keyfileq.pem']
env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"
env.user="ubuntu"
yerine kullanırsanız ilk örneğiniz benim için işe yarar env.user=["ubuntu"]
.
Bunu bugün yapmak zorundaydım, .py dosyam olabildiğince basitti, @ YuvalAdam'ın cevabındaki gibi, ama yine de bir şifre girmem isteniyor ...
paramiko
(Fabric tarafından ssh için kullanılan kitaplık) günlüğüne baktığımda şu satırı buldum:
Uyumsuz ssh eşi (kabul edilebilir kex algoritması yok)
Şununla güncelledim paramiko
:
sudo pip install paramiko --upgrade
Ve şimdi çalışıyor.
Yukarıda belirtildiği gibi, Fabric bir modadan sonra .ssh / config dosyası ayarlarını destekleyecektir, ancak ec2 için bir pem dosyası kullanmak sorunlu görünmektedir. IOW düzgün bir kurulum .ssh / config dosyası 'ssh sunucuadı' aracılığıyla komut satırından çalışacak ve env.host = ['sunucuadı'] olduğunda 'fab sometask' ile çalışmayacaktır.
Bu, fabfile.py dosyamda env.key_filename = 'keyfile' belirtilerek ve zaten .ssh / config dosyamda bulunan IdentityFile girişini çoğaltarak aşıldı.
Bu, Fabric veya paramiko olabilir, benim durumumda Fabric 1.5.3 ve Paramiko 1.9.0 idi.
Bu cevaplardan hiçbiri py3.7, fabric2.5.0 ve paramiko 2.7.1'de benim için işe yaramadı.
Bununla birlikte, belgelerde PKey özniteliğini kullanmak işe yarar: 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....