我检查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。正如你所看到的那样,应该解决这个问题。
答案 0 :(得分:4)
这是因为ansible使用的新版本的python模块assign
和docker
不兼容。我不得不恢复并明确指定以下版本的PIP包:
这些的示例剧本任务:
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)
遇到了同样的问题。详细说明:
"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.
删除您的Ansible软件包(在我的情况下,我会通过pip安装Ansible):
pip uninstall ansible
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