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
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.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.
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"'
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 }}"