Ansible Role创建用户oper1后后续任务触发UNREACHABLE错误的求助
Ansible Role创建用户oper1后后续任务触发UNREACHABLE错误的求助
嘿,我一眼就看出你遇到了Ansible创建新用户后常见的临时目录权限问题,这问题我帮好几个同行解决过,给你梳理下原因和靠谱的解决办法!
问题核心拆解
先帮你把问题点提炼清楚:
- 你在Role里成功执行了创建
oper1用户的任务,但所有后续任务直接抛出UNREACHABLE错误 - 错误的本质是:Ansible尝试在
/home/oper1/.ansible/tmp路径下创建临时任务目录,但权限不足或目录结构不合法,导致无法完成临时文件的创建,进而中断任务
为什么会出现这个问题?
Ansible默认会在远程执行用户的家目录下创建.ansible/tmp目录来存放临时任务文件,而你刚创建的oper1用户:
- 家目录默认权限是
700(仅自己可读写),如果后续任务是用其他用户(比如root)执行,会无法写入oper1的家目录 - 即使后续任务用
oper1执行,刚创建的用户家目录里还没有.ansible/tmp这个子目录,Ansible尝试创建时可能因为umask或系统限制失败
靠谱的解决办法(按推荐优先级排序)
方法1:修改Ansible远程临时文件路径到/tmp(最简单高效)
这也是错误提示里官方推荐的方案,直接让Ansible用系统公共的/tmp目录存放临时文件,避开用户家目录的权限限制:
- 方式A:全局配置(修改
ansible.cfg)[defaults] remote_tmp = /tmp/.ansible/tmp - 方式B:在Role/Playbook里临时设置(仅对当前任务生效)
在你的Role的defaults/main.yml里添加:
或者直接在Playbook的vars里定义:ansible_remote_tmp: /tmp/.ansible/tmp- name: 你的Playbook名称 hosts: all vars: ansible_remote_tmp: /tmp/.ansible/tmp roles: - 你的Role名称
方法2:创建用户时提前初始化ansible临时目录
如果必须用用户家目录存放临时文件,可以在创建oper1的任务后,手动创建并设置好/home/oper1/.ansible/tmp的权限:
- name: Creazione utente user: name: oper1 state: present create_home: yes - name: 初始化Ansible临时目录(解决后续任务权限问题) file: path: /home/oper1/.ansible/tmp state: directory owner: oper1 group: oper1 mode: '0700' recurse: yes
方法3:确认远程执行用户的一致性
检查你的Role/Playbook是否在创建用户后切换了远程执行用户:
- 如果后续任务需要用
oper1执行,必须确保:- 在Playbook里明确指定
remote_user: oper1(或通过become: yes+become_user: oper1切换) oper1用户已经设置了正确的认证方式(比如SSH密钥、密码),能正常登录远程主机
- 在Playbook里明确指定
- 如果后续任务还是用原来的执行用户(比如root),则不需要切换,这时候用方法1的临时路径方案最稳妥
验证方案
建议先试方法1,修改远程临时路径到/tmp,这个方案几乎不会有副作用,而且能快速解决问题。如果必须用用户家目录,再用方法2初始化目录。
备注:内容来源于stack exchange,提问作者Nik Developer
相关产品推荐
相关产品推荐

