You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:52:52