Ejecutar el comando Dentro del Contenedor Docker Usando Ansible


Lo que estoy tratando de lograr es ejecutar comandos dentro de un contenedor Docker que ya ha sido creado en un Ubuntu Digital Ocean/Docker Droplet usando Ansible.

Parece que no puedo encontrar nada en esto, o me estoy perdiendo algo. Esta es mi tarea ansible en mi libro de juego. Soy muy nuevo en Ansible, así que cualquier consejo o sabiduría sería muy apreciada.

- 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
Author: Nigel Earle, 2015-10-01

4 answers

Debería ser capaz de ejecutar un script (con su secuencia de comandos en él) con docker exec:

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

(Ver también " ¿Por qué tengo que usar bash -l -c dentro de mi contenedor?")

  • /path/to/script debe ser accesible por su proceso Ansible.
  • /path/to/log es una ruta dentro del contenedor, que podría compartirse en un volumen.
 14
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:09

Después de discutir con algunos desarrolladores muy útiles sobre el proyecto ansible github, una mejor manera de hacer esto es así:

- 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 tiene instalado python en su imagen, puede usar el módulo de comandos o cualquier otro módulo en lugar de raw.

Si desea hacer esto en un host de docker remoto, agregue:

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

Al bloque add_host.

Vea la documentación Ansible para un ejemplo más completo.

 23
Author: Bernie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-13 02:00:01

Puede ejecutar comandos dentro de contenedores docker utilizando el módulo de comandos {[5] } Por ejemplo, este código se ejecutará echo "Hello1" y echo "Hello2" en mi_container :

   tasks:
        - name: Execute commands in docker container
          command: docker exec -it my_container bash -c 'echo "Hello1"; echo "Hello2"'
 4
Author: Ander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-08 00:00:19

Actualizar: hay una manera de hacer esto sin usar mi módulo, ver mi otra respuesta

Escribí un módulo simple para ejecutar exec en un host de Docker remoto. Lo he enviado al proyecto ansible, pero puedes añadirlo fácilmente a tus propios proyectos si lo necesitas. El módulo tiene solo 23 líneas de largo, tómelo de mi solicitud de extracción y agréguelo a su ./ library directory, y luego puede agregar una tarea en su libro de jugadas de la siguiente manera:

  - 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 }}"
 1
Author: Bernie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-13 02:09:06