2011-08-26 7 views
14

Ho un vm in esecuzione con vagabondo e lo sto fornendo a Chef. Uno dei passaggi prevede la clonazione di un repository git, ma la mia ssh-key (sul mio computer host) ha una passphrase su di esso.usa le chiavi ssh con passphrase su una configurazione vagabonda + chef

Quando corro vagrant up, il processo non riesce a passo git clone con il seguente errore:
Permission denied (publickey). fatal: The remote end hung up unexpectedly
(La chiave è stata aggiunta sulla macchina host, con la frase)

ho provato per risolvere questo con l'inoltro agente ssh effettuando le seguenti operazioni:
Aggiunto config.ssh.forward_agent = true al VagrantFile
Aggiunto Defaults env_keep = "SSH_AUTH_SOCK-/etc/sudoers su vm

Ora, vagrant up non riesce ancora quando arriva alla parte clone git, ma se eseguo vagrant provision dopo, passa. Suppongo che ciò sia dovuto al fatto che la configurazione ssh è configurata quando vm viene richiamato e non viene ricaricato

Ho provato a ricaricare ssh dopo aver regolato queste due impostazioni, ma ciò non ha aiutato.

Qualche idea su come risolvere questo problema?

Grazie.

risposta

10

Come è stato notato, l'aggiornamento di sudoers durante la corsa iniziale è troppo tardi per essere utile per quella corsa dato che lo chef sta già eseguendo sudo da quel punto.

Invece ho scritto una ricetta hacky che trova il socket ssh appropriato per utilizzare e aggiorna l'ambiente SSH_AUTH_SOCK per soddisfare. Disabilita anche il rigoroso controllo della chiave dell'host in modo che la connessione iniziale in uscita venga automaticamente approvata.

Salva questo come una ricetta che viene eseguita in qualsiasi momento prima della prima connessione ssh (testato con Ubuntu ma dovrebbe funzionare con altre distribuzioni):

Directory "/root/.ssh" do 
    action :create 
    mode 0700 
end 

File "/root/.ssh/config" do 
    action :create 
    content "Host *\nStrictHostKeyChecking no" 
    mode 0600 
end 

ruby_block "Give root access to the forwarded ssh agent" do 
    block do 
    # find a parent process' ssh agent socket 
    agents = {} 
    ppid = Process.ppid 
    Dir.glob('/tmp/ssh*/agent*').each do |fn| 
     agents[fn.match(/agent\.(\d+)$/)[1]] = fn 
    end 
    while ppid != '1' 
     if (agent = agents[ppid]) 
     ENV['SSH_AUTH_SOCK'] = agent 
     break 
     end 
     File.open("/proc/#{ppid}/status", "r") do |file| 
     ppid = file.read().match(/PPid:\s+(\d+)/)[1] 
     end 
    end 
    # Uncomment to require that an ssh-agent be available 
    # fail "Could not find running ssh agent - Is config.ssh.forward_agent enabled in Vagrantfile?" unless ENV['SSH_AUTH_SOCK'] 
    end 
    action :create 
end 

creare alternativa una scatola con l'aggiornamento sudoers già in esso e base le tue future VM fuori da quello.

+0

grazie ha funzionato per me! – Anentropic

+0

Fantastico, funziona !!! –

+2

Per coloro che vogliono fare la stessa cosa in bash: https://gist.github.com/bendavis78/5464209. Vedi qui su come aggiungere questo nel tuo Vagrantfile: http://docs-v1.vagrantup.com/v1/docs/provisioners/shell.html –

3

Questa potrebbe non essere la risposta che stai cercando, ma una soluzione semplice sarebbe quella di generare una chiave ssh di distribuzione dedicata senza passphrase. Preferisco le chiavi di distribuzione separate e dedicate piuttosto che una singola chiave per più applicazioni.

2

È possibile eseguire più provisioner con Vagrant (anche dello stesso tipo), ogni provisioner viene eseguito sulla propria connessione SSH. Solitamente risolvo questo problema utilizzando un provisioner Shell che aggiunge Added Defaults env_keep = "SSH_AUTH_SOCK" a /etc/sudoers sul VM.

Ecco lo script Bash che uso per fare proprio questo:

#!/usr/bin/env bash 

# Ensure that SSH_AUTH_SOCK is kept 
if [ -n "$SSH_AUTH_SOCK" ]; then 
    echo "SSH_AUTH_SOCK is present" 
else 
    echo "SSH_AUTH_SOCK is not present, adding as env_keep to /etc/sudoers" 
    echo "Defaults env_keep+=\"SSH_AUTH_SOCK\"" >> "/etc/sudoers" 
fi 

Non ho ancora testato questo con il Provisioner Chef, solo con l'aggiunta di rifornitori di Shell ... ma da quanto ho capito questo dovrebbe funzionare il lo stesso per il tuo caso d'uso.

0

La maggior parte delle caselle di base sono dotate di chiavi ssh predefinite/non sicure, è facile abilitare lo passwordless ssh auth for vagrant ma deve essere utilizzato solo per il test.