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

问题描述 投票:8回答:4

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

python docker pip ansible
4个回答
4
投票

这是因为ansible使用的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 }

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


4
投票

对我来说,指定docker-py工作的路径。

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

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

完全归功于Clay Graham关于这个问题的精彩文章:

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


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一起使用。
  • 如果你需要一个更旧版本的docker,比如1.6,那么你就会遇到ansible 1.9

1
投票

TL; DR

不要使用--user标志来安装docker模块,然后使用-b--become标志用于ansible-playbook,因为提升的playbook实例将看不到为其他用户安装的docker模块。


事后看来,对于其他人来说,为什么我遇到一个问题可能是显而易见的,但无论出于何种原因,我选择使用pip的docker标志安装--user,然后让不幸的“想法”使用-b--become选项。

这导致“明显”安装的docker模块对运行我的剧本的高架Ansible实例不可用。分享以防某人有“那些日子之一”并在以后偶然发现。希望它可以帮助你,因为我用一点点“愚蠢的税”来支付这个提醒,希望对我们两个人来说足够了。 :)

© www.soinside.com 2019 - 2024. All rights reserved.