Ansible无法导入docker-py,尽管已经安装。

12

我查看了这篇文章,并按照两个答案中的修复方法操作,但都没有起作用。我开了一个新帖子,部分原因是因为之前的解决方法不行,另一方面是因为我得到了一个稍微不同的错误,尽管问题可能是相同的。

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

(相关错误):

"导入docker-py失败 - 无法导入NotFound名称。尝试使用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 版本,这应该可以解决此问题。

8个回答

8
这是因为ansible使用的python模块dockerdocker-py的新版本不兼容。我不得不回退并显式地指定以下版本的PIP软件包:
  • docker: 2.0.0
  • docker-py: 1.10.6
这里是针对它们的示例playbook任务:
- 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和docker python模块,因为它们使用相同的命名空间并导致安装损坏”。 - Bruno Thomas

7

1
感谢您指出问题所在...对我来说,问题是远程Docker主机(RHEL7)将python-urllib3软件包安装到了/usr/lib/python2.6/而不是/usr/lib/python2.7/。按照Clay Graham的描述,在我的Ansible脚本中扩展PYTHONPATH让我重新开始工作了。 - Bernie

6

TL;DR

不要使用pip的--user标志安装docker模块,然后再为ansible-playbook使用-b--become标志,因为升级的播放实例将无法看到为不同用户安装的docker模块。


事后看来,我遇到问题的原因可能对其他人来说很明显,但出于某种原因,我选择使用pip的--user标志安装docker,然后不幸地想到使用-b--become选项。

这导致"显然"已安装的docker模块在运行我的playbook的升级Ansible实例中不可用。分享一下,以防有人过得"那样的日子",后来偶然发现这个问题。希望这可以帮助你,因为我为这个提示付出了相当多的"愚蠢税",希望足够为我们两个人付账。:)


这实际上是我在这里找到的最有用的答案。 - emmdee

2

在远程服务器上(Debian 10),我使用ansible 2.4.3.0和python2作为解释器遇到了相同的问题。

我尝试了很多组合,包括不同版本的docker、docker-py、docker-compose pip模块,但只有在做了以下操作之后才开始正常工作:

apt-get install python-docker

在服务器上

也可以通过playbook进行安装

- name: Install required system packages
  apt: name=python-docker state=latest update_cache=yes

1

在Ansible的docker*模块文档中,对于docker-py模块的要求并不是最新的,但一般来说,以下是一些可以工作的ansible - docker-py配对:

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

  • 如果您需要使用旧版本的docker,则可以使用docker 1.7与ansible 2.0.1.0和docker-py 1.4.0。

  • 如果您需要使用更早期的docker版本,如1.6,则必须使用ansible 1.9。


1
但是由于我的服务器上有2.1.0.0版本,并且已经尝试过1.7.0 docker-py和1.11 docker,却无法使用。我为任何感到沮丧的人提供一个解决方法,即始终使用name = registry启动注册表容器,然后在playbook中使用docker ps --filter=name=registry -q并将输出注册为变量,然后使用shell命令,例如docker stop {{ docker_regID.stdout }}等。 - volvox
@SztupY 你是说远程主机必须安装Docker,还是本地主机必须安装?它是通过Docker守护进程进行通信吗? - Breedly

1
在我的情况下,我必须在安装docker pip模块时使用state: forcereinstall选项,然后问题就解决了! 在调用任何其他主任务/操作或导入其他基于yml文件的任务之前,添加以下主任务/操作即可起作用!-- 当没有使用此选项时,Ansible的docker安装显示ok:...,即docker已经安装,但随后,我使用docker_* ansible模块的其他操作仍然给出上述no named module错误。
# If forcereinstall is removed, you may get an error i.e. no module found 
#
- name: "Force Install 'docker' pip module"
  pip:
    name: docker
    extra_args: "--no-index --find-links={{ docker_SDK_Python_dest_path_where_I_see_bunch_of_whl_or_tar_gz_files }}"
    state: forcereinstall

1

我遇到了相同的问题。详细描述如下:

  • 我在安装了 Ansible 版本 2.9.11 的机器上运行了 ansible。
  • 我想要部署的机器上也安装了 Ansible 版本 2.9.11,但是它无法正常工作,我得到了错误信息:"Failed to import docker or docker-py - cannot import name __version__. Try pip install docker or pip install docker-py (Python 2.6)"

如何解决我的问题:

Just downgrade Ansible version from 2.9.11 to 2.7.9 on machine where you would to deploy.
  1. Remove you Ansible package (in my case I install Ansible with pip):

    pip uninstall ansible
    
  2. Install version of Ansible 2.7.9:

    pip install ansible==2.7.9
    
在我的情况下,它的运行非常顺畅!

0
将以下内容添加到您的“hosts”文件中:
[servers:vars]更改为[your-group-of-server-names:vars] 适用于Python >= 2.7
[servers:vars]
ansible_python_interpreter=/usr/bin/python3 # For Python3 [default Ubuntu-18.04]

Python <= 2.7

[servers:vars]
ansible_python_interpreter=/usr/bin/python # For Python2.7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接