2015-10-01 10 views
16

versuche ich, Befehle in einem Docker-Container auszuführen, der bereits auf einem Digital Ocean Ubuntu/Docker-Droplet mit Ansible erstellt wurde.Befehl innerhalb des Docker-Containers ausführen Mit Ansible

Ich kann nichts finden, oder ich vermisse etwas. Das ist meine Ansible Aufgabe in meinem Spielbuch. Ich bin sehr neu zu Ansible, so dass jeder Rat oder Weisheit sehr geschätzt werden würde.

- 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

Leider zeigt die von Ihnen angenommene Antwort nicht, wie das Skript über Ansible ausgeführt wird, sondern wie es vom Andock-Host ausgeführt wird. Wenn Sie es über Ansible arbeiten lassen, könnten Sie bitte Ihre Lösung posten – schmidlop

Antwort

10

Sie sollten ein Skript ausführen können (in es mit Ihrer Sequenz des Befehls) mit docker exec:

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

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

  • /path/to/script sein sollte Zugänglich durch Ihren Ansible-Prozess.
  • /path/to/log ist ein Pfad innerhalb des Containers, der in einem Volume gemeinsam genutzt werden kann.
+0

Das hat funktioniert! Vielen Dank @VonC –

+0

Könnten Sie die Bedeutung von "sollte durch Ihren Ansible-Prozess zugänglich sein" klären? Bedeutet das, dass das Skript auf der ansprechbaren Kontrollmaschine sein sollte? Der Docker-Host? oder im Container? – schmidlop

+1

@schmidlop meinte ich: da läuft schon ein container. In diesem Container befindet sich '/ path/to/script', das nicht korrekt ausgeführt wurde.Eine Möglichkeit, das Skript erneut zu versuchen, ist es, es auszuführen (von einem 'docker exec' Befehl vom Linux Host) und seine Ergebnisse auf dem Host in'/path/to/log' zu protokollieren. – VonC

2

Sie Befehle innerhalb Docker-Container mit den command module Zum Beispiel wird ausgeführt echo "Hello1" und echo "Hello2" in my_container dieser Code ausführen kann:

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

Dies funktioniert, wenn sich der Andockcontainer auf demselben Computer befindet, auf dem das ansible-Skript ausgeführt wird. Was passiert, wenn der Andockcontainer auf einer anderen Maschine ausgeführt wird? – Bernie

+0

Ich glaube nicht, dass das stimmt, @Bernie. Soweit ich weiß, funktioniert local_action wie beschrieben, aber das Befehlsmodul wird immer auf dem Remote-Host ausgeführt, es sei denn, der Parameter delegate_to wird angegeben. –

+0

Ich musste 'docker exec -i ' verwenden, um diesen Fehler zu vermeiden 'das Eingabegerät ist kein TTY' – vikas027

1

Update: es gibt eine Möglichkeit, dies zu tun, ohne meine Modul, siehe meine andere Antwort

Ich schrieb ein einfaches Modul zum Ausführen von Exec auf einem Remote-Docker-Host. Ich habe submitted it to the ansible project, aber Sie können es leicht zu Ihren eigenen Projekten hinzufügen, wenn Sie müssen. Das Modul ist nur 23 Zeilen lang, nehmen Sie es aus meiner Pull-Anforderung und fügen Sie sie ./library Verzeichnis, und dann können Sie eine Aufgabe in Ihrem Textbuch wie so hinzufügen:

- 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

Die PR wurde nicht zusammengeführt und der Autor schloss sie mit dem Hinweis "Ich gebe jetzt zu, es gibt keinen Sinn für mein Modul.". –

12

Nach einer Diskussion mit einigen sehr hilfreich Entwickler auf der ansible github project, ein besserer Weg, dies zu tun, ist in etwa so:

- 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 

Wenn Sie python in Ihrem image installiert haben, können Sie den Befehl Modul oder ein anderes Modul statt roh verwenden können.

Wenn Sie diese auf einem Remote-Host-Docker tun möchten, fügen Sie:

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

zum add_host Block.

Ein ausführlicheres Beispiel finden Sie unter Ansible documentation.

+0

Interessant und genauer als meine Antwort. +1 – VonC

+0

Danke für die Hilfe. Wie üblich, löste ein Neustart von Grund auf Probleme. – techraf

+1

Dies erfordert Docker API-Zugriff auf den Host mit der Docker Engine (wenn nicht localhost) - wenn Firewall-Regeln dies blockieren, müssen Sie möglicherweise die "Docker Exec ... bash -c ..." -Ansatz verwenden. Ich sehe nicht, wie Sie Delegate_to für den Remote-Host verwenden können, da es bereits für die Docker-Verbindung zu Container verwendet wird. – RichVel

Verwandte Themen