2014-07-15 11 views
8

Il modulo di sincronizzazione di Ansible (v1.6.5) richiede la passphrase (Immettere passphrase per chiave) anche se l'ho già inserito all'inizio di esecuzione del playbook.Ansible sincronizza prompt password anche se è già stata immessa all'inizio

Qualche idea del perché?

eseguo il mio playbook con le seguenti opzioni:

-u myuser --ask-sudo-pass --private-key=/path/to/id_rsa 

Ecco il mio compito sincronizzare:

- name: synchronize source files in src location 
    sudo: yes 
    synchronize: src={{local_src}} dest={{project_dirs.src}} archive=yes delete=yes rsync_opts=["--compress"] 
    when: synchronize_src_files 

UPDATE con ssh-agent

Seguendo il consiglio di Lekensteyn, ho provato con ssh-agent. Non ho più un prompt ma l'attività non riesce. Cosa mi manca?

eval `ssh-agent -s` 
ssh-add ~/.ssh/id_rsa 

L'errore:

TASK: [rolebooks/project | synchronize source files in src location] ********** 
failed: [10.0.0.101] => {"cmd": "rsync --delay-updates -FF --compress --delete-after --archive --rsh 'ssh -i /home/vagrant/.ssh/id_rsa -o StrictHostKeyChecking=no' --rsync-path=\"sudo rsync\" [--compress] --out-format='<<CHANGED>>%i %n%L' /projects/webapp [email protected]:/var/local/sites/project1/src", "failed": true, "rc": 12} 
msg: sudo: no tty present and no askpass program specified 
rsync: connection unexpectedly closed (0 bytes received so far) [sender] 
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.0] 

risposta

11

Il synchronize comando (fino ad almeno Ansible 1.6.6) sembra ignorare la presa di controllo SSH normale aperto da Ansible. Il vostro compito potrebbe espandersi al seguente:

{ 
    "cmd": "rsync --delay-updates -FF --compress --archive 
     --rsh 'ssh -o StrictHostKeyChecking=no' 
     --out-format='<<CHANGED>>%i %n%L' 
     /home/me/src/ [email protected]:/dest/", 
    "failed": true, 
    "rc": 23 
} 

per ottenere questi dettagli, eseguire il playbook con l'opzione -v. Per ovviare a questo problema, è possibile avviare ssh-agent e aggiungere nella cache la chiave SSH con ssh-add. Fare riferimento alle pagine del manuale per i dettagli.

avvertimenti aggiuntivi con il modulo synchronize:

  • Quando viene eseguito con sudo: yes, ansible verrà eseguito con --rsh 'sudo ssh' che romperà se la configurazione di sudo remoto richiede una password e/o TTY. Soluzione: impostare sudo: no nella definizione dell'attività.
  • L'utente che accede al computer remoto è l'utente SSH (ansible_ssh_user), non l'utente sudo. Non ho trovato un modo per ignorare questo utente (oltre a un metodo non testato che sovrascrive l'utente con l'opzione -o User tramite una delle altre opzioni (dest_port="22 -o User=your_user"?) In combinazione con set_remote_user=yes).

Questo è preso dal mio file compiti:

- name: sync app files 
    sudo: no 
    synchronize: src={{app_srcdir}}/ dest={{appdir}}/ 
       recursive=yes 
       rsync_opts=--exclude=.hg 
# and of course Ubuntu 12.04 does not support --usermap.. 
#,--chown={{deployuser}}:www-data 
# the above goes bad because ansible_ssh_user=user has no privileges 
# local_action: command rsync -av --chown=:www-data 
#     {{app_srcdir}} 
#     {{deployuser}}@{{inventory_hostname}}:{{appdir}}/ 
# when: app_srcdir is defined 
# The above still goes bad because {{inventory_hostname}} is not ssh host... 
+0

ok, quindi quello che sto vivendo è il comportamento "normale", non è un problema solo nel mio caso. L'uso di ssh-agent funziona o è un suggerimento da provare? – Michael

+0

È un comportamento "normale", ma è sottinteso che rsync non usi il socket di controllo di Ansible che dovrebbe evitare la necessità di riautenticazione. ssh-agent funziona di sicuro, è ciò che faccio io (e probabilmente la maggior parte delle altre persone). Viene anche menzionato su http://docs.ansible.com/intro_getting_started.html – Lekensteyn

+0

@YAmikep L'errore deriva da 'sudo' che significa che il comando SSH ha avuto successo. Ho già detto che trovo la "sincronizzazione" la parte peggiore, non integrata di ansible? – Lekensteyn

2

Ho provato ad utilizzare il modulo di copia, ma ci vuole troppo tempo. Quindi, per far funzionare il modulo di sincronizzazione, farò quanto segue. Non è perfetto ma almeno funziona.

  1. cambiamento della proprietà e le autorizzazioni della cartella remota di destinazione per l'utente che sto usando

  2. uso sincronizzare senza sudo

  3. arretrato la proprietà e le autorizzazioni della destinazione remota a quello che ho desiderato prima

+0

Se la sincronizzazione fallisce, (3) non verrà eseguito, il che potrebbe comportare il fallimento della distribuzione. Questo potrebbe essere aggirato aggiungendo 'ignore_errors: True' e aggiungendo un ulteriore controllo dopo' register: sync_result', ma anche questo non è ideale. Forse qualcuno lo ha già segnalato al bug tracker di Ansible? – Lekensteyn

+0

@Lekensteyn C'è una segnalazione di bug su "Sincronizza modulo chiedendo una password durante la riproduzione di una cartella" https://github.com/ansible/ansible/issues/7071 – Michael

5

Penso che per impostazione predefinita la sincronizzazione imposti esplicitamente un nome utente sul comando rsync - si c un impedirlo e consentire a rsync di funzionare dal tuo file di configurazione ssh.

http://docs.ansible.com/synchronize_module.html

set_remote_user put user @ per i percorsi remoti. Se si dispone di una configurazione ssh personalizzata per definire l'utente remoto per un host che non corrisponde all'utente dell'inventario, è necessario impostare questo parametro su "no".

Ho un utente remoto configurato nella mia ssh config e avevo bisogno di aggiungere set_remote_user=no per sincronizzarmi al lavoro, altrimenti ha provato a usare il nome utente sbagliato e né la chiave ssh né la password avrebbero funzionato.

1

Il modo migliore per avvicinarsi a questo è installare la chiave per ssh authorized_keys per l'utente root sul server remoto.

+2

Questo è stato probabilmente prematuramente downvoted, considerando che molti servizi di contenitore remoto (come come EC2) _technically_ supporta già gli accessi root (tramite 'ssh ec2-user @ node; sudo su'). Quindi non è un reale rischio per la sicurezza copiare le chiavi su root. Se mai, rende la vita più semplice. – robert

+0

La rimozione della chiave dall'utente root remoto dopo il completamento di 'synchronize' ridurrebbe il rischio per la sicurezza a una finestra temporale ristretta. –

2

La disattivazione dinella macchina remota risolve questo problema (a costo di una sicurezza leggermente ridotta). Ad esempio,

# 
# This file MUST be edited with the 'visudo' command as root. 
# 
# Please consider adding local content in /etc/sudoers.d/ instead of 
# directly modifying this file. 
# 
# See the man page for details on how to write a sudoers file. 
# 
Defaults  env_reset,!tty_tickets 
# ... 
Problemi correlati