Ansible在Windows环境下使用become/become_user的权限/所有者问题
问题分析与解决方案
你的问题根源在于Windows上Ansible的become: yes行为和你预期的不一样:当你设置become: yes时,Ansible会触发UAC权限提升(默认以Administrator身份),此时即使指定become_user: vagrant,命令其实是在管理员的安全上下文下模拟vagrant用户执行——创建的目录所有者依然是管理员组,vagrant用户并没有该目录的完全控制权限,所以删除时会提示需要管理员权限。
下面是几种解决办法:
1. 直接以vagrant用户执行(推荐,无需权限提升)
如果C:\tmp目录本身允许普通用户创建文件夹(Windows默认是允许的),完全不需要使用become,直接用vagrant用户执行命令即可:
- name: Create gogo1 directory as vagrant user win_shell: mkdir c:\tmp\gogo1 # 去掉become相关配置,Ansible会用连接时的vagrant用户直接执行
或者用更优雅的win_file模块(避免shell命令的兼容性问题):
- name: Create gogo1 directory using win_file win_file: path: c:\tmp\gogo1 state: directory
2. 提升权限创建后修正目录权限
如果必须通过管理员权限创建目录(比如路径在系统保护目录下),可以先创建,再用win_acl模块给vagrant用户添加完全控制权限:
- name: Create gogo1 directory with admin rights win_shell: mkdir c:\tmp\gogo1 become: yes become_user: Administrator vars: ansible_become_pass: <你的管理员密码> - name: Grant full control to vagrant on gogo1 directory win_acl: path: c:\tmp\gogo1 user: vagrant rights: FullControl type: allow state: present inherit: ContainerInherit, ObjectInherit propagation: None
3. 理解Windows上的become机制(避免踩坑)
在Windows环境中,become: yes本质是调用RunAs命令提升到管理员权限,become_user在这里的作用是在管理员上下文下模拟该用户,而不是直接切换到该用户的非管理员会话。这和Linux的sudo -u行为完全不同,这也是你遇到权限问题的核心原因。
内容的提问来源于stack exchange,提问作者langlauf.io
相关产品推荐
相关产品推荐

