使用Ansible的docker_service模块部署Docker环境遇问题求助
我之前也碰到过类似的坑,结合你描述的情况——目标机用sudo docker-compose在CLI能正常运行,但Ansible调用docker_service模块时却出异常,哪怕加了--ask-sudo-pass,给你几个具体的排查点:
检查docker_service模块的Python依赖
docker_service模块依赖的是Python版的docker-compose包,不是系统里的docker-compose二进制文件。哪怕你系统里装了docker-compose,Ansible调用的是Python库的接口,所以得确保目标机上用sudo安装了这个依赖:sudo pip3 install docker-compose注意要对应Ansible使用的Python版本(比如用
pip还是pip3),版本不匹配也会导致调用失败。验证Ansible sudo上下文的环境变量
有时候sudo会重置环境变量(比如PATH),导致Ansible找不到docker相关的执行路径。你可以在Playbook里加个临时任务,对比手动sudo和Ansible sudo的环境差异:- name: 查看sudo后的PATH环境变量 command: echo $PATH become: yes register: sudo_path_output - name: 输出PATH内容 debug: var=sudo_path_output.stdout把这个输出和你手动在目标机执行
sudo echo $PATH的结果对比,看看docker的bin目录(比如/usr/local/bin)是不是在Ansible的sudo PATH里。确认docker_service模块的路径参数正确性
一定要确保docker_service的project_src参数指向的是目标机上存在且sudo用户可访问的docker-compose.yml所在目录。比如你的Playbook配置:- name: 部署Docker服务 docker_service: project_src: /opt/my-docker-project state: present become: yes先手动验证目标机上
sudo ls /opt/my-docker-project/docker-compose.yml能正常输出文件内容,排除路径错误或权限问题。开启Ansible详细调试日志
执行Playbook时加上-vvv参数,能获取到模块执行的详细报错信息,这是定位问题最直接的方式:ansible-playbook your-deploy-playbook.yml --ask-sudo-pass -vvv从日志里能看到模块调用时的具体异常,比如是Python库连接Docker daemon失败,还是docker-compose.yml语法解析错误。
临时用command模块调用docker-compose二进制排查
既然目标机CLI的sudo docker-compose能正常运行,你可以先在Playbook里用command模块直接调用它,排除模块本身的问题:- name: 测试直接调用docker-compose command: docker-compose up -d args: chdir: /opt/my-docker-project become: yes如果这个任务能成功,那问题大概率出在
docker_service模块的依赖或参数配置上;如果这个也失败,那就要检查Ansible的sudo配置(比如sudoers文件里是否限制了某些执行参数)。
内容的提问来源于stack exchange,提问作者cooshal

