web-dev-qa-db-fra.com

Ansible ne peut pas importer docker-py même s’il est installé

J'ai vérifié ce post et suivi le correctif dans les deux réponses et aucune n'a fonctionné. J'ouvre un nouveau poste en partie à cause de cela et en partie parce que j'obtiens une erreur légèrement différente alors que le problème est peut-être le même.

Ansible Host:

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

Mon serveur de destination:

$ 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
...

Serveur Ansible (ansible-playbook alias to ap):

$ ap -vvvv test.yml

Le résultat:

(sortie probablement étrangère, coupée):

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": 

(l'erreur pertinente):

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

Je reçois la même erreur lorsque je rétrograde le module docker-py à la version 1.1.0 conformément à la première réponse du message référencé. J'ai aussi essayé de modifier les répertoires et cela n'a fait aucune différence:

(/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/

à partir de chmod -R go+rx docker*.

Quelqu'un a-t-il déjà vu cela avant? J'ai essayé d'utiliser le module pip ansible pour installer les modules puis, après les avoir retirés manuellement, je les ai réinstallés manuellement comme indiqué dans le message référencé. J'utilise aussi 2.1.0.0. comme vous pouvez le voir, ce qui était supposé résoudre ce problème.

8
volvox

En effet, les nouvelles versions des modules python docker et docker-py utilisées par ansible sont incompatibles. J'ai dû revenir en arrière et spécifier explicitement les versions suivantes des packages PIP:

  • docker: 2.0.0
  • docker-py: 1.10.6 

Exemple de tâche de livre de lecture pour ceux-ci:

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

Tous mes livres de jeu fonctionnent bien depuis lors. 

4
anoxis

Pour moi, spécifier le chemin d'accès à docker-py a fonctionné.

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

En gros, Ansible cherchait dans le mauvais répertoire.

Un grand merci à Clay Graham pour son excellent article sur le sujet:

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

4

La configuration requise pour le module docker-py dans la documentation ansible relative aux modules docker * n'est pas vraiment à jour, mais voici généralement quelques paires anible - docker-py qui devraient fonctionner:

  • Ansible 2.1.0.0 nécessite au moins la version 1.7.0 de docker-py, qui à son tour requiert au moins docker 1.9 installé sur le client.

  • Si vous devez utiliser une version antérieure de docker, vous pouvez utiliser docker 1.7 avec ansible 2.0.1.0 et docker-py 1.4.0.

  • Si vous avez besoin d'une version encore plus ancienne de docker, telle que 1.6, vous êtes coincé avec ansible 1.9

1
SztupY