Ansible配置remote_tmp后K8s容器仍报Failed to create temporary directory错误(GCP环境)
我之前在GCP环境部署K8s集群+配套服务器的时候,正好碰到过一模一样的问题!当时盯着报错信息折腾了好一阵,才搞明白为啥ansible.cfg里的remote_tmp对K8s容器不起作用,给你分享下我踩坑后的解决思路和实操方案:
问题根源
Ansible连接K8s容器用的是kubectl连接插件,这个插件默认不会直接继承ansible.cfg里[defaults]段的remote_tmp配置——毕竟容器和本地Ansible执行环境是完全隔离的,而且很多K8s容器里根本没有/home/user这个目录,或者容器运行的用户没有该目录的写入权限,自然会创建临时目录失败。
解决方法(按优先级推荐)
1. 在Inventory/Group Vars里针对性配置
如果你的Inventory里把K8s容器单独分组了,直接在组变量里设置最省心:
- 比如在
group_vars/k8s_containers.yml里添加:ansible_remote_tmp: /tmp/.ansible/tmp - 或者直接在Inventory文件里给容器主机加变量:
这样所有属于[k8s_containers] my-k8s-container ansible_connection=kubectl ansible_remote_tmp=/tmp/.ansible/tmpk8s_containers组的容器都会自动用/tmp下的临时目录,不会影响其他SSH连接的服务器。
2. 在Playbook里直接指定变量
如果只是个别Play需要针对容器调整,直接在Play的vars里设置即可:
- name: 部署K8s容器内应用 hosts: k8s_containers vars: ansible_remote_tmp: /tmp/.ansible/tmp tasks: - name: 执行容器内命令 command: echo "测试临时目录权限"
这个方法优先级最高,会覆盖ansible.cfg和Inventory里的配置,适合临时调试或者特殊场景。
3. 在ansible.cfg里给kubectl插件单独配置
其实Ansible的kubectl插件支持单独的配置段,你可以直接在ansible.cfg里加一段:
[kubectl] remote_tmp = /tmp/.ansible/tmp
这样所有用kubectl连接的主机(也就是K8s容器)都会自动使用这个临时目录,其他SSH连接的主机还是用你在[defaults]里设置的路径,一次配置全局生效。
4. 检查容器内的权限和目录
有时候即使设置了/tmp路径,还是会报错,这时候可以手动进入容器验证:
kubectl exec -it <你的容器名> -- mkdir -p /tmp/.ansible/tmp
如果执行失败,大概率是容器的securityContext限制了用户权限,或者/tmp目录被设置了特殊权限,这时候需要调整容器的安全配置,确保运行用户有/tmp的写入权限。
调试小技巧
运行Playbook时加上-vvv参数,就能看到Ansible实际执行的mkdir命令,确认是不是用了你设置的临时目录,方便排查变量有没有生效。
备注:内容来源于stack exchange,提问作者1wonder

