Ansible Playbook执行Kubernetes节点加入时提权后找不到shell脚本
Kubernetes节点加入集群脚本找不到问题解决方案
修复步骤
- 修正Ansible提权配置语法
你最后测试的配置存在语法错误,sudo become: yes不符合Ansible规范,正确的提权写法如下:
- name: Join the node to cluster become: yes shell: /tmp/join-command.sh
Ansible提权统一使用 become、become_method、become_user 三个参数即可,不要额外添加sudo关键字。
统一使用绝对路径执行脚本
放弃相对路径写法./tmp/join-command.sh,所有执行场景统一使用绝对路径/tmp/join-command.sh,避免Ansible执行任务时工作目录变化导致路径解析失败。排查PrivateTmp路径隔离问题
如果节点的sshd服务开启了PrivateTmp=true,Ansible执行上下文看到的/tmp目录和你登录节点看到的/tmp属于不同的命名空间,会导致文件找不到。
验证和修复方法:
- 执行
systemctl show sshd | grep PrivateTmp检查配置,如果返回值为yes则需要修改 - 编辑sshd服务配置文件,将
PrivateTmp改为no - 执行以下命令重启服务生效:
systemctl daemon-reload systemctl restart sshd
你也可以暂时把脚本拷贝到/home/marlon/等非/tmp目录执行,验证是否是该问题导致。
- 修复脚本换行符格式
如果脚本是在Windows环境下生成的,默认使用CRLF换行符,Linux系统无法正确识别,也会出现找不到文件的报错。可以在拷贝脚本的任务中添加换行符转换配置:
- name: Copy the join command to server location become_user: marlon copy: src: join-command dest: /tmp/join-command.sh mode: 0777 newline_sequence: '\n'
也可以登录节点执行dos2unix /tmp/join-command.sh转换格式后手动执行验证。
- 前置校验文件状态
可以在执行脚本前增加校验任务,确认文件实际存在:
- name: Verify join script exists stat: path: /tmp/join-command.sh register: script_stat - debug: msg: "Script exists: {{ script_stat.stat.exists }}, permissions: {{ script_stat.stat.mode }}"
内容的提问来源于stack exchange,提问作者Marlon Goncalves
相关产品推荐
相关产品推荐

