docker - ansible即使安装了也找不到python包

标签 docker docker-compose ansible devops

尝试使用 docker_compose 模块在 ansible 剧本中使用 docker-compose。请注意,我可以在 ansible 中成功使用 docker 模块,但遇到 docker_compose 模块的问题。我在本地使用纯文本变量进行测试,我使用 ansible-vault 来存储 secret 。

在 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

最佳答案

您声明,您已验证这些包是否存在,但您可以通过多种方式安装包,但这些包不会在全局范围内可用。例如,您可以将它们安装在 virtualenv 中或仅供您的用户使用。
如果 ansible 告诉你它缺少这些包,它就找不到它们。您在机器上以 root 身份运行 ansible (become: true),因此您需要确保这些包对 root 可用。< br/> (编辑:这实际上是问题所在。该包对用户 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 模块的同一个剧本/角色中。像这样,我确信即使同事在机器上乱搞,我的东西也能正常工作,他们也可以“按原样”使用我的代码,而无需先安装一些东西。

补充说明:

  • 在使用模块之前,请始终检查模块要求的文档并安装它们。例如 docker_compose module .
  • 另请注意,您需要将它们安装在远程主机上,而不是 ansible-controller!
  • 看看 documentation of the pip module如果您使用的是 virtualenv。

关于docker - ansible即使安装了也找不到python包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68362261/

相关文章:

linux - Docker 卷将文件绑定(bind)为远程 linux 服务器上的目录

git - Ansible galaxy provisionner 未在 Vagrant 中使用私钥

python - 无法多次运行ansible的k8s模块(非幂等)

python - 也使用 python 脚本的 Rshiny 应用程序的 Docker 镜像

python - 在jupyter dockerfile中创建非root用户

docker - 容器停止后Docker Compose保持网络正常运行

docker - 兼容模式不支持以下部署子键

python - 如何通过 Ansible 远程执行具有多个模块的 Python?

django postgresql 用户密码验证失败

docker - "exec:\"去\": executable file not found in $PATH"