在Ansible中使用通配符设置文件权限报错,该如何解决?
解决Ansible设置Tomcat bin目录下.sh文件权限的问题
嘿,我来帮你搞定这个权限设置的问题!首先得搞清楚你为啥会遇到这个错误:Ansible的file模块**不支持直接用通配符(比如*.sh)**匹配多个文件。它会把*.sh当成一个具体的文件名去查找,而不是自动匹配所有后缀为.sh的文件,所以才会提示文件不存在。
下面给你几个靠谱的解决方案,按推荐程度排序:
方案1:用find模块+循环(最推荐,符合Ansible幂等性)
先通过find模块找到目标目录下所有的.sh文件,再循环给每个文件设置权限。这样既能准确匹配文件,又能保证重复执行时只有需要修改的文件才会被变更:
- hosts: all tasks: - name: 查找tomcat/bin下所有.sh文件 ansible.builtin.find: paths: /tomcat/apache-tomcat-8.5.23/bin patterns: "*.sh" register: sh_files_result - name: 为找到的.sh文件设置权限 ansible.builtin.file: path: "{{ item.path }}" owner: tomcat group: tomcat mode: '0755' # 这里用字符串格式更稳妥,避免数字解析问题 loop: "{{ sh_files_result.files }}"
方案2:用shell模块(不推荐,仅作备选)
如果你只是临时解决问题,也可以用shell模块直接执行系统命令,但这个方法的缺点是不满足幂等性——每次执行都会标记为"changed",不管权限已经是正确的状态:
- hosts: all tasks: - name: 通过shell命令设置权限 ansible.builtin.shell: | chown tomcat:tomcat /tomcat/apache-tomcat-8.5.23/bin/*.sh chmod 755 /tomcat/apache-tomcat-8.5.23/bin/*.sh
额外检查事项
除了调整Playbook,你可以先确认以下几点:
- 目标主机上的
/tomcat/apache-tomcat-8.5.23/bin/目录确实存在,路径拼写没有错误 tomcat用户和组在目标主机上已经正确创建,且没有拼写错误
内容的提问来源于stack exchange,提问作者Torikul Alam




