Ansible no puede importar docker-py aunque esté instalado

Revisé esta publicación y seguí la corrección en ambas respuestas y ninguna funcionó. Estoy abriendo una nueva publicación en parte debido a eso y en parte porque recibo un error ligeramente diferente, aunque el problema podría ser el mismo.

Ansible host:

$ ansible --version ansible 2.1.0.0 config file = /etc/ansible/ansible.cfg configured module search path = Default w/o overrides 

Cliente de destino myserver:

 $ pip list | egrep 'six|docker|websocket_client' docker-py (1.2.3) six (1.10.0) 

test.yml:

 --- - hosts: myserver remote_user: root tasks: - name: stop any running docker registries docker_container: name: registry state: stopped ... 

Servidor ansible (ansible-playbook con alias para ap):

$ ap -vvvv test.yml

La salida:

(probablemente salida extraña, cortada):

 fatal: [myserver]: FAILED! => { "changed": false, "failed": true, "invocation": { "module_args": { "api_version": null, "blkio_weight": null, "cacert_path": null, "capabilities": null, "cert_path": null, "command": null, "cpu_period": null, "cpu_quota": null, "cpu_shares": null, "cpuset_cpus": null, "cpuset_mems": null, "debug": false, "detach": true, "devices": null, "dns_opts": null, "dns_search_domains": null, "dns_servers": null, "docker_host": null, "entrypoint": null, "env": null, "etc_hosts": null, "exposed_ports": null, "filter_logger": false, "force_kill": false, "groups": null, "hostname": null, "image": null, "interactive": false, "ipc_mode": null, "keep_volumes": true, "kernel_memory": null, "key_path": null, "kill_signal": null, "labels": null, "links": null, "log_driver": "json-file", "log_options": null, "mac_address": null, "memory": "0", "memory_reservation": null, "memory_swap": null, "memory_swappiness": null, "name": "registry", "network_mode": null, "networks": null, "oom_killer": null, "paused": false, "pid_mode": null, "privileged": false, "published_ports": null, "pull": false, "read_only": false, "recreate": false, "restart": false, "restart_policy": null, "restart_retries": 0, "security_opts": null, "shm_size": null, "ssl_version": null, "state": "stopped", "stop_signal": null, "stop_timeout": null, "timeout": null, "tls": null, "tls_hostname": null, "tls_verify": null, "trust_image_content": false, "tty": false, "ulimits": null, "user": null, "uts": null, "volume_driver": null, "volumes": null, "volumes_from": null }, "module_name": "docker_container" }, "msg": 

(El error pertinente):

"Failed to import docker-py - cannot import name NotFound. Try pip install docker-py"}

Recibo el mismo error al degradar el módulo docker-py a 1.1.0 según la primera respuesta en la publicación referenciada. También intenté chmod los directorios y no hizo ninguna diferencia:

 (/usr/lib/python2.7/site-packages) myserver$ ls -lad docker* drwxr-xr-x. 6 root root 4096 Jul 4 10:57 docker/ drwxr-xr-x. 2 root root 4096 Jul 4 10:57 docker_py-1.2.3-py2.7.egg-info/ 

desde chmod -R go+rx docker* .

¿Alguien ha visto esto antes? He intentado usar el módulo pip ansible para instalar los módulos y luego, después de eliminarlos manualmente, los reinstalé manualmente como en la publicación de referencia. También estoy usando 2.1.0.0. Como se puede ver, se suponía que debía solucionar este problema.

Esto se debe a que las nuevas versiones de los módulos de Python docker y docker-py son imposibles de usar. Tuve que volver atrás y especificar explícitamente las siguientes versiones de paquetes PIP:

  • ventana acoplable: 2.0.0
  • ventana acoplable: 1.10.6

Ejemplo de tarea de libro de jugadas para estos:

 - name: install certain python modules for docker pip: name: "{{ item.name }}" version: "{{ item.version }}" state: present with_items: - { name: docker, version: 2.0.0 } - { name: docker-py, version: 1.10.6 } 

Todos mis libros de juego funcionan bien desde entonces.

Para mí especificar el camino a docker-py trabajado.

 - hosts:  environment: PYTHONPATH: "/home/path/.local/lib/python2.7/site-packages" 

Básicamente, Ansible estaba buscando en el directorio equivocado.

Crédito completo a Clay Graham por su gran artículo sobre el tema:

https://medium.com/dronzebot/ansible-and-docker-py-path-issues-and-resolving-them-e3834d5bb79a

Los requisitos para el módulo docker-py en la documentación de ansible para los módulos de la ventana acoplable * no están realmente actualizados, pero en general aquí hay algunos pares ansible – docker-py que deberían funcionar:

  • Ansible 2.1.0.0 requiere al menos la versión 1.7.0 de docker-py, que a su vez requiere que al menos el docker 1.9 esté instalado en el cliente.

  • Si necesita usar una versión anterior de la ventana acoplable, entonces puede usar la ventana acoplable 1.7 con ansible 2.0.1.0 y la ventana acoplable 1.4.0.

  • Si necesita una versión aún más antigua de la ventana acoplable, como 1.6 entonces está atascado con ansible 1.9

En retrospectiva, probablemente era obvio para todos los demás por qué me encontraba con un problema, pero por alguna razón opté por instalar la --user docker utilizando el indicador de --user y luego tuve la desafortunada “idea” de usar la opción -b o --become .

Esto dio como resultado que el módulo docker “obviamente” instalado no estuviera disponible para la instancia elevada de Ansible que ejecuta mi libro de jugadas. Compartir en caso de que alguien tenga “uno de esos días” y tropiece con esto más adelante. Espero que te ayude, ya que pagué por este recordatorio con un poco de “impuesto estúpido”, espero que sea suficiente para los dos. 🙂