Ansible运行docker_compose模块报No module named 'compose'错误
问题根因
- 本地安装的Docker Compose v2.6.1是Go编译的独立二进制程序,不会向Python环境提供可导入的
compose模块 - pyenv安装的Python版docker-compose v1.29.2仅在pyenv管理的Python 3.9环境中生效,Ansible执行模块默认调用系统自带Python解释器,未加载pyenv环境配置,无法读取pyenv虚拟环境内安装的compose包
- 当前使用的
community.docker.docker_compose模块为适配Compose v1(Python版本)开发,默认依赖Python环境的compose模块,无法直接识别系统中的Compose v2二进制文件
解决方案
可根据自身需求任选以下一种方案修复:
方案1:给Ansible调用的Python环境直接装依赖(最快修复)
- 先查询Ansible当前默认使用的Python解释器路径,执行命令:
ansible -m setup localhost | grep ansible_python_executable - 用查询到的Python解释器对应的pip安装docker-compose包,比如查询结果显示解释器路径为
/usr/bin/python3,就执行:/usr/bin/python3 -m pip install docker-compose
安装完成后重新运行playbook即可正常执行。
方案2:换用支持Compose v2的官方新模块(长期使用推荐)
community.docker集合3.0.0及以上版本提供了专门适配Compose v2二进制的community.docker.docker_compose_v2模块,不需要安装任何Python版本的compose依赖,可以直接调用系统里已经装好的Docker Compose v2,参数和老模块基本兼容。
首先升级本地的community.docker集合到最新版:ansible-galaxy collection install community.docker:>=3.0.0 --upgrade
然后修改playbook,替换模块名即可:
- name: Deploy services with docker compose v2 hosts: localhost gather_facts: no tasks: - name: Start services community.docker.docker_compose_v2: project_src: "/opt/X/{{item}}" files: [ "docker-compose.yml" , "docker-compose.override.yml" ] state: present with_items: - kubefwd - filebeat - kibana - logstash - metricbeat
方案3:临时指定Ansible使用pyenv中的Python解释器
如果不想修改系统Python的包,也不想替换现有模块,可以在运行playbook时显式指定Ansible使用pyenv里已经装了docker-compose的Python解释器,执行命令时追加参数即可:ansible-playbook elastic.yml -e ansible_python_interpreter=/Users/X/.pyenv/versions/3.9-dev/bin/python3
注意把路径替换成pyenv环境中Python 3.9的实际可执行文件路径。
内容的提问来源于stack exchange,提问作者alexus
相关产品推荐
相关产品推荐

