web-dev-qa-db-fra.com

Exécuter la commande à l'intérieur du conteneur Docker à l'aide d'Ansible

ce que j'essaie d'accomplir, c'est d'exécuter des commandes à l'intérieur d'un conteneur Docker qui a déjà été créé sur une gouttelette Digital Ocean Ubuntu/Docker à l'aide d'Ansible.

Je n'arrive pas à trouver quoi que ce soit là-dessus, ou il me manque quelque chose. C'est ma tâche Ansible dans mon livre de jeu. Je suis très nouveau chez Ansible, donc tout conseil ou sagesse serait grandement apprécié.

- 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
31
Nigel Earle

Vous devriez pouvoir exécuter un script (avec votre séquence de commandes) avec docker exec :

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

(Voir aussi " Pourquoi dois-je utiliser bash -l -c à l'intérieur de mon conteneur? ")

  • /path/to/script devrait être accessible par votre processus Ansible.
  • /path/to/log est un chemin à l'intérieur du conteneur, qui pourrait être partagé dans un volume.
17
VonC

Après discussion avec des développeurs très utiles sur le projet github ansible , une meilleure façon de le faire est la suivante:

- 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

Si vous avez python installé dans votre image, vous pouvez utiliser le module de commande ou tout autre module au lieu de raw.

Si vous souhaitez le faire sur un hôte Docker distant, ajoutez:

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

au bloc add_Host.

Voir documentation Ansible pour un exemple plus complet.

35
Bernie

Vous pouvez exécuter des commandes dans des conteneurs Docker en utilisant module de commande Par exemple, ce code exécutera echo "Hello1" et echo "Hello2" dans mon_conteneur :

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

Mise à jour: il existe un moyen de le faire sans utiliser mon module, voir mon autre réponse

J'ai écrit un module simple pour exécuter exec sur un hôte Docker distant. J'ai soumis au projet ansible , mais vous pouvez facilement l'ajouter à vos propres projets si vous en avez besoin. Le module ne fait que 23 lignes, prenez-le de ma demande de tirage et ajoutez-le à votre répertoire ./library, puis vous pouvez ajouter une tâche dans votre playbook comme suit:

  - 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
Bernie