Tengo una aplicación Rails que estoy implementando en contenedores Docker. Quiero hacer desarrollo desde el contenedor de Docker para que se comporte de forma coherente entre entornos.

Tengo un libro de jugadas de Ansible que inicia los contenedores de Docker en el servidor remoto, y está funcionando bien. Pensé que usaría las mismas tareas de Ansible para iniciar los contenedores y vincularlos en mi Mac.

Sin embargo, cuando ejecuto el libro de jugadas en mi instancia local, obtengo errores como:

fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "`docker-py` doesn't seem to be installed, but is required for the Ansible Docker module."}

Parece que el problema es que Ansible está haciendo un ssh local en la Mac, pero lo necesito para conectarme a la máquina acoplable.

¿Cómo uso Ansible para ejecutar tareas en contenedores Docker que se ejecutan en mi Mac?

2
David Ham 29 ene. 2016 a las 01:33

2 respuestas

La mejor respuesta

De hecho, el problema era que Ansible estaba tratando de ingresar a mi máquina local. Cuando ejecuta Docker en una Mac, crea una máquina virtual, y cuando ejecuta comandos como docker ps en una terminal, se ejecuta en Docker Engine que se ejecuta en esa máquina virtual.

Terminé siguiendo los consejos de este artículo: Uso de Vagrant y Docker Machine Together. Creé una nueva VM con vagrant, basada en la imagen ubuntu / trusty64, y luego la habilité para usar con Docker usando docker create. Luego agregué la IP de esta VM a mi archivo de inventario de Ansible, así:

192.168.99.101 ansible_user=vagrant ansible_ssh_private_key_file=/path/to/virtualbox/private_key

Es un poco incómodo porque no hay forma de hacer que esta nueva VM sea la predeterminada que usa Docker Toolbox, pero por lo demás es una buena manera de controlar el sistema operativo host de su máquina virtual.

Estoy probando docker-compose nuevamente, ya que creo que podría ser mejor para el desarrollo local, pero es bueno poder ejecutar el mismo libro de jugadas para implementarlo en cualquier entorno.

1
David Ham 29 feb. 2016 a las 20:52

Cuando escribe el ansible, debe asegurarse de dónde se está ejecutando

- hosts: HOSTS_TO_RUN_FOLLOWING_TASKS
  tasks:
    - name: NAME_OF_TASK
      shell: SHELL_CMD

Cuando desee ejecutar en diferentes hosts en el mismo ansible, solo necesita escribir esto nuevamente:

- hosts: NEW_HOST_TO_RUN_TASKS
  tasks:
    - name: NAME_OF_TASK
      shell: SHELL_CMD

Si coloca "localhost" en "hosts:", se ejecutará en el host local. Si desea ejecutar en un host específico, ejecute el comando /etc/ansible/hosts --refresh-cache y use las etiquetas en el resultado.

Por ejemplo, si el resultado es

"tag_Name_Production":
[
   "124.125.125.121", 
   "124.125.125.122", 
   "124.125.125.123"
]

Y desea ejecutar el comando en todos estos, solo use:

- hosts: tag_Name_Production
  tasks:
    - name: NAME_OF_TASK
      shell: SHELL_CMD
1
Gal Gibli 4 feb. 2016 a las 10:23