即使已安装,ansible 也找不到 python 包
ansible can't find a python package even if it is installed
尝试在使用 docker_compose
模块的 ansible 剧本中使用 docker-compose
。请注意,我可以在 ansible 中成功使用 docker 模块,但 运行 会遇到 docker_compose
模块的问题。我在本地使用纯文本变量进行测试,我使用 ansible-vault 来存储秘密。
在 ansible 文档中解释说他们的 docker-compose 模块仅支持 docker-compose 的版本 1 和 2。
这是我的 docker-compose.yml
:
---
version: "2.4"
services:
my_demo:
build: .
networks:
demo_net:
ipv4_address: 172.0.1.2
ports:
- 8080:8080
image: demo_image
networks:
demo_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.0.1.0/30
gateway: 172.0.1.1
这是我的 main.yml
:
---
- hosts: localhost
connection: local
become: true
vars:
- ansible_sudo_pass: password
- ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Docker compose
docker_compose:
project_name: docker_fhe_ansible
project_src: .
build: yes
register: output
- debug:
var: output
输出:
PLAY [localhost] **********************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************
ok: [localhost]
TASK [Docker compose] *****************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Failed to import the required Python library (Docker SDK for Python: docker (Python >= 2.7) or docker-py (Python 2.6)) on ubuntu's Python /usr/bin/python3. Please read module documentation and install in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter, for example via `pip install docker` or `pip install docker-py` (Python 2.6). The error was: No module named 'docker'"}
PLAY RECAP ****************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
错误是“没有名为 docker 的模块”,我可以验证 python3 有模块:
john@ubuntu:~/Documents/docker-ansible$ python3
Python 3.8.10 (default, Jun 2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
>>> import ansible
Failed to import [...] on ubuntu's Python /usr/bin/python3 [...] error was: No module named 'docker'
但是您可以从本地 Python 解释器导入模块。
检查您用来测试的python3
确实是/usr/bin/python3
(例如which python3
)。如果没有,您可以使用 Ansible ansible_python_interpreter
指定正确的 Python 解释器。
您声明,您已验证这些包是否存在,但您可以通过多种方式安装包,但这些包无法在全球范围内使用。例如,您可以将它们安装在 virtualenv 中或仅供您的用户使用。
如果 ansible 告诉你它缺少这些包,它就找不到它们。您在机器 (become: true
) 上 运行 与 root
一样,因此您需要确保这些软件包可用于 root
。
(编辑:这实际上是问题所在。该软件包可供用户 john
使用,但不适用于 root
)
您缺少 docker
模块(可能还有其他要求)。
使用
在游戏开始时安装它们
- name: ensure required pip-packages are installed
pip:
name:
- docker>=1.8.0
- PyYAML>=3.11
- docker-compose>=1.7.0
如果您使用单独的 playbook 安装它们,请确保在该 playbook 上也使用 become: true
,否则它将再次仅为您的用户安装。
我在编写剧本或角色时通常做的是确保首先安装所有必需的包。这意味着我会将任务放在使用 docker_compose
模块的同一个 playbook/role 中。像这样,我确信即使同事在机器上乱搞,我的东西也能正常工作,他们也可以“按原样”使用我的代码,而无需先安装一些东西。
补充说明:
- 在使用模块之前,请始终检查模块要求的文档并安装它们。例如对于 docker_compose module.
- 另请注意,您需要将它们安装在远程主机上,而不是 ansible-controller!
- 如果您使用的是 virtualenv,请查看 documentation of the pip module。
尝试在使用 docker_compose
模块的 ansible 剧本中使用 docker-compose
。请注意,我可以在 ansible 中成功使用 docker 模块,但 运行 会遇到 docker_compose
模块的问题。我在本地使用纯文本变量进行测试,我使用 ansible-vault 来存储秘密。
在 ansible 文档中解释说他们的 docker-compose 模块仅支持 docker-compose 的版本 1 和 2。
这是我的 docker-compose.yml
:
---
version: "2.4"
services:
my_demo:
build: .
networks:
demo_net:
ipv4_address: 172.0.1.2
ports:
- 8080:8080
image: demo_image
networks:
demo_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.0.1.0/30
gateway: 172.0.1.1
这是我的 main.yml
:
---
- hosts: localhost
connection: local
become: true
vars:
- ansible_sudo_pass: password
- ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Docker compose
docker_compose:
project_name: docker_fhe_ansible
project_src: .
build: yes
register: output
- debug:
var: output
输出:
PLAY [localhost] **********************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************
ok: [localhost]
TASK [Docker compose] *****************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Failed to import the required Python library (Docker SDK for Python: docker (Python >= 2.7) or docker-py (Python 2.6)) on ubuntu's Python /usr/bin/python3. Please read module documentation and install in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter, for example via `pip install docker` or `pip install docker-py` (Python 2.6). The error was: No module named 'docker'"}
PLAY RECAP ****************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
错误是“没有名为 docker 的模块”,我可以验证 python3 有模块:
john@ubuntu:~/Documents/docker-ansible$ python3
Python 3.8.10 (default, Jun 2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
>>> import ansible
Failed to import [...] on ubuntu's Python /usr/bin/python3 [...] error was: No module named 'docker'
但是您可以从本地 Python 解释器导入模块。
检查您用来测试的python3
确实是/usr/bin/python3
(例如which python3
)。如果没有,您可以使用 Ansible ansible_python_interpreter
指定正确的 Python 解释器。
您声明,您已验证这些包是否存在,但您可以通过多种方式安装包,但这些包无法在全球范围内使用。例如,您可以将它们安装在 virtualenv 中或仅供您的用户使用。
如果 ansible 告诉你它缺少这些包,它就找不到它们。您在机器 (become: true
) 上 运行 与 root
一样,因此您需要确保这些软件包可用于 root
。
(编辑:这实际上是问题所在。该软件包可供用户 john
使用,但不适用于 root
)
您缺少 docker
模块(可能还有其他要求)。
使用
- name: ensure required pip-packages are installed
pip:
name:
- docker>=1.8.0
- PyYAML>=3.11
- docker-compose>=1.7.0
如果您使用单独的 playbook 安装它们,请确保在该 playbook 上也使用 become: true
,否则它将再次仅为您的用户安装。
我在编写剧本或角色时通常做的是确保首先安装所有必需的包。这意味着我会将任务放在使用 docker_compose
模块的同一个 playbook/role 中。像这样,我确信即使同事在机器上乱搞,我的东西也能正常工作,他们也可以“按原样”使用我的代码,而无需先安装一些东西。
补充说明:
- 在使用模块之前,请始终检查模块要求的文档并安装它们。例如对于 docker_compose module.
- 另请注意,您需要将它们安装在远程主机上,而不是 ansible-controller!
- 如果您使用的是 virtualenv,请查看 documentation of the pip module。