使用Ansible管理Docker容器时临时目录解析失败求助
问题描述
基于Alpine Linux镜像创建Docker容器时,为防止容器退出设置了tty: true参数。将容器加入Ansible inventory的my_grp组,使用docker连接方式执行任务时,出现远程临时目录解析失败的错误:
fatal: [mx]: FAILED! => {"msg": "failed to resolve remote temporary directory from ansible-tmp-1705229690.3186123-3468-162624220881664: `( umask 77 && mkdir -p \"` echo ~/.ansible/tmp `\"&& mkdir \"` echo ~/.ansible/tmp/ansible-tmp-1705229690.3186123-3468-162624220881664 `\" && echo ansible-tmp-1705229690.3186123-3468-162624220881664=\"` echo ~/.ansible/tmp/ansible-tmp-1705229690.3186123-3468-162624220881664 `\" )` returned empty string"}
安装Python3后问题依旧,更换Ubuntu镜像测试也出现相同错误。完整复现脚本如下:
#!/bin/sh docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock alpine ash -c ' apk add docker-cli ansible py3-requests ansible-playbook <( cat <<EOF - name: Manage docker container hosts: localhost connection: local gather_facts: false vars: container_name: "my_alpine_cont" tasks: - name: Create VM container community.docker.docker_container: name: "{{ container_name }}" image: alpine tty: true - name: Install Python3 community.docker.docker_container_exec: container: "{{ container_name }}" command: apk add python3 # needed for ansible to work - name: Add to inventory add_host: name: "{{ container_name }}" ansible_connection: docker EOF ) '
故障原因
核心问题是仅设置tty: true的容器,默认启动的是交互模式的shell,而Ansible的docker连接插件以非交互方式执行命令时,交互shell不会返回预期的输出结果。
具体细节:
- 当只配置
tty: true而未指定command或entrypoint时,容器会启动镜像默认的交互shell(比如Alpine的ash -i、Ubuntu的bash -i)。 - Ansible的docker连接插件在执行任务前,会运行一段shell命令来创建并返回临时目录路径,但交互模式的shell在非交互输入下不会正常输出命令结果,导致Ansible无法获取临时目录的路径,最终抛出错误。
- 安装Python3无法解决问题,因为故障根源不是Python缺失,而是容器的shell运行模式与Ansible的执行逻辑不兼容。
解决方法
给容器指定一个非交互的后台运行命令,替代默认的交互shell,让容器保持运行的同时,支持非交互方式执行命令:
修改community.docker.docker_container任务,添加command: sleep infinity参数:
- name: Create VM container community.docker.docker_container: name: "{{ container_name }}" image: alpine tty: true command: sleep infinity
这样容器会以sleep infinity作为启动命令,保持后台运行,同时Ansible通过docker连接插件执行命令时,容器内的shell会以非交互模式正常处理命令,返回预期的输出结果。
内容的提问来源于stack exchange,提问作者Giulio
相关产品推荐
相关产品推荐

