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

Ansible配置remote_tmp后K8s容器仍报Failed to create temporary directory错误(GCP环境)

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/tmp
    
    这样所有属于k8s_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:24:40