2015-10-01 21 views
16

ciò che sto cercando di eseguire è eseguire comandi all'interno di un contenitore Docker che è già stato creato su un droplet Ubuntu/Docker Digital Ocean utilizzando Ansible.Esegui comando all'interno del contenitore Docker Usando Ansible

Non riesco a trovare nulla su questo, o mi manca soprattutto qualcosa. Questo è il mio compito di Ansible nel mio libro di esercizi. Sono molto nuovo ad Ansible, quindi qualsiasi consiglio o saggezza sarebbe molto apprezzato.

- name: Test Deploy 
    hosts: [my-cluster-of-servers] 

tasks: 
    - name: Go Into Docker Container And Run Multiple Commands 
    docker: 
     name: [container-name] 
     image: [image-ive-created-container-with-on-server] 
     state: present 
     command: docker exec -it [container-name] bash 
+2

sfortunatamente la risposta che hai accettato non mostra come eseguire lo script tramite Ansible, invece mostra come eseguire dall'host di docker. Se hai avuto modo di lavorare via Ansible potresti pubblicare la tua soluzione – schmidlop

risposta

10

Dovreste essere in grado di eseguire uno script (con la sequenza di comandi in esso) con docker exec:

docker exec container-name bash -l -c /path/to/script > /path/to/log 

(vedi anche "Why do I have to use bash -l -c inside my container?")

  • /path/to/script dovrebbe essere accessibile dal tuo processo Ansible.
  • /path/to/log è un percorso all'interno del contenitore, che può essere condiviso in un volume.
+0

Che ha funzionato! Grazie mille @VonC –

+0

Potresti chiarire il significato di "dovrebbe essere accessibile dal tuo processo Ansible"? Significa che la sceneggiatura dovrebbe essere sulla macchina di controllo ansible? L'host di docker? o dentro il contenitore? – schmidlop

+1

@schmidlop intendevo: c'è già un contenitore in esecuzione. All'interno di quel contenitore, c'è '/ path/to/script' che non è stato eseguito correttamente.Un modo per riprovare quello script è eseguirlo (da un comando 'docker exec' eseguito dall'host Linux) e registrare i suoi risultati sull'host in'/path/to/log' – VonC

2

È possibile eseguire i comandi all'interno di contenitori docker utilizzando l'command module Per esempio questo codice verrà eseguito echo "Hello1" e echo "Hello2" in my_container:

tasks: 
     - name: Execute commands in docker container 
      command: docker exec -it my_container bash -c 'echo "Hello1"; echo "Hello2"' 
+0

Funziona se il contenitore finestra mobile si trova sulla stessa macchina su cui è in esecuzione lo script ansible. Cosa succede se il contenitore mobile è in esecuzione su un altro computer? – Bernie

+0

Non credo sia vero, @ Bernie. La mia comprensione è che local_action fa come si descrive, ma il modulo di comando viene eseguito sempre sull'host remoto, a meno che non venga fornito il parametro delegate_to. –

+0

Ho dovuto usare 'docker exec -i ' per evitare questo errore 'il dispositivo di input non è un TTY' – vikas027

1

Update: c'è un modo per farlo senza usare la mia modulo, vedere la mia altra risposta

Ho scritto un modulo semplice per eseguire exec su un host Docker remoto. Ho submitted it to the ansible project, ma puoi aggiungerlo facilmente ai tuoi progetti, se necessario. Il modulo è lungo solo 23 righe, portarlo dalla mia richiesta di pull e aggiungerlo alla vostra directory ./library, e quindi è possibile aggiungere un'attività nel vostro playbook in questo modo:

- name: Run docker exec command 
    docker_exec: 
     command: <some command> 
     docker_host: <docker host> 
     name: <container name> 
    register: exec_output 

    - name: Show exec output 
    debug: msg="{{ exec_output.result }}" 
+0

Il PR non è stato fuso e l'autore lo ha chiuso con la nota "Ammetto ora, non c'è alcun senso al mio modulo". –

12

Dopo la discussione con alcuni molto utile Gli sviluppatori sul ansible github project, un modo migliore per farlo è in questo modo:

- name: add container to inventory 
    add_host: 
    name: [container-name] 
    ansible_connection: docker 
    changed_when: false 

- name: run command in container 
    delegate_to: [container-name] 
    raw: bash 

Se avete installato python nella vostra immagine, è possibile utilizzare il modulo di comando o di qualsiasi altro modulo al posto di materie prime.

Se si vuole fare questo su un host finestra mobile remoto, aggiungere:

ansible_docker_extra_args: "-H=tcp://[docker-host]:[api port]" 

al blocco add_host.

Vedere l'Ansible documentation per un esempio più completo.

+0

Interessante e più preciso della mia risposta. +1 – VonC

+0

Grazie per l'aiuto. Come al solito, il riavvio da zero ha risolto i problemi. – techraf

+1

Ciò richiede l'accesso all'API Docker all'host con il Docker Engine (se non localhost) - se le regole del firewall lo bloccano, potrebbe essere necessario utilizzare l'approccio 'docker exec ... bash -c ...'. Non vedo come si possa usare delegate_to per l'host remoto, poiché è già in uso per la connessione docker al contenitore. – RichVel

Problemi correlati