即使已经安装,Ansible也不能导入docker-py

我检查了这个post ,并在两个答案中修复,都没有工作。 我打开一个新的post部分是因为这个,部分原因是我得到一个稍微不同的错误,即使问题可能是相同的。

Ansible主持人:

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

目标客户端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 ... 

Ansible服务器(ansible-playbook别名为ap):

$ ap -vvvv test.yml

输出:

(可能无关紧要):

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

(相关的错误):

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

当我将docker-py模块降级到1.1.0时,我得到了同样的错误。 我也尝试chmod目录,它没有任何区别:

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

chmod -R go+rx docker*

有没有人见过这个? 我已经尝试使用pip ansible模块来安装模块,然后手动删除它们后,重新安装它们,如在参考文章中手动。 我也使用2.1.0.0。 正如你所看到的,这本来是为了解决这个问题。

这是因为python模块dockerdocker-py新版本是不兼容的。 我不得不还原并明确指定以下版本的PIP包:

  • docker工人:2.0.0
  • docker-py:1.10.6

这些示例剧本任务:

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

从那时起,我所有的玩书都运行良好。

对于指定docker-py工作的path。

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

基本上Ansible正在寻找错误的目录。

关于这个问题的伟大的文章充分感谢克莱·格雷厄姆:

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

docker-py模块在docker *模块的ansible的文档中的需求并不是最新的,但是通常这里有一些可行的docker-py对应该工作:

  • Ansible 2.1.0.0至less需要docker-py版本1.7.0,而这又要求在客户端至less安装docker 1.9。

  • 如果您需要使用较旧版本的docker,那么您可以使用docker 1.7和2.0.1.0和docker-py 1.4.0。

  • 如果你需要一个更老版本的Docker,比如1.6,那么你就会陷入1.9的困境