Ansible无法导入docker-py,即使它已安装

时间:2016-07-04 09:38:06

标签: python docker pip ansible

我检查this 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。正如你所看到的那样,应该解决这个问题。

8 个答案:

答案 0 :(得分:4)

这是因为ansible使用的新版本的python模块assigndocker不兼容。我不得不恢复并明确指定以下版本的PIP包:

  • docker:2.0.0
  • docker-py:1.10.6

这些的示例剧本任务:

docker-py

从那以后,我所有的游戏都很好用。

答案 1 :(得分:4)

为我指定docker-py工作的路径。

- 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

答案 2 :(得分:1)

docker-py模块对于docker *模块的ansible文档的要求并不是最新的,但通常这里有一些应该有效的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一起使用。

  • 如果你需要一个更老版本的码头工具,比如1.6那么你就会陷入ansible 1.9

答案 3 :(得分: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. 删除您的Ansible软件包(在我的情况下,我会通过pip安装Ansible):

    pip uninstall ansible
    
  2. Ansible 2.7.9的安装版本:

    pip install ansible==2.7.9
    

就我而言,它就像一个魅力!

答案 4 :(得分:1)

就我而言,我在安装 state: forcereinstall pip 模块时不得不使用 docker 选项,问题就消失了!!

在添加以下主要任务/动作之后,在调用任何其他主要任务/动作或导入其他基于 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

答案 5 :(得分:0)

事后看来,其他所有人可能都很清楚我为什么会遇到问题,但是出于任何原因,我选择使用pip的docker标志安装--user,然后不幸地出现了“想法”使用-b--become选项。

这导致运行我的剧本的提升的Ansible实例无法使用“显然”已安装的docker模块。共享以防万一某人有“那些日子中的某一天”,并在此后偶然发现。希望它能对您有所帮助,因为我为此支付了一些“愚蠢的税”,对我们俩都足够了。 :)

答案 6 :(得分:0)

将此添加到您的“主机”文件中:

[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

答案 7 :(得分:0)

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

我已经尝试了很多不同版本的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