Ansible如何仅为脚本递归设置执行权限位?
实现批量为*.sh脚本添加可执行权限的最优方案
方案一:用Ansible原生模块组合(推荐)
这种方式完全贴合Ansible设计逻辑,自带幂等性,且能清晰在日志中看到哪些文件的权限被修改。
示例Playbook代码:
- name: 查找目标目录下所有.sh文件 ansible.builtin.find: path: "{{ targetdir }}" patterns: "*.sh" file_type: file recurse: yes register: sh_files - name: 为所有.sh文件添加可执行权限 ansible.builtin.file: path: "{{ item.path }}" mode: "u+x,g+x,o+x" state: file loop: "{{ sh_files.files }}" when: sh_files.files | length > 0
说明:
find模块会递归查找目标目录下所有符合条件的.sh文件,结果存入sh_files变量file模块循环处理每个文件,仅当文件权限不符合设置时才执行变更,日志会单独记录每个变更的文件(比如changed: [host] => (item={'path': '/xxx/script.sh', ...}))- 加入
when判断避免无匹配文件时执行无效循环
方案二:用find -exec结合command模块(需手动判断变更)
如果偏好使用find -exec语法,可通过command模块执行,并利用changed_when捕获实际变更情况:
示例Playbook代码:
- name: 为.sh文件添加可执行权限并记录变更 ansible.builtin.command: find {{ targetdir }} -type f -name "*.sh" -exec chmod +x {} \; -print register: chmod_result changed_when: chmod_result.stdout_lines | length > 0
说明:
-print参数会让find输出权限被修改的文件路径(仅当权限确实需要变更时才会输出,因为chmod +x本身是幂等操作)changed_when根据命令输出行数判断是否有变更,有输出则标记为changed,日志会显示被修改的文件列表
方案对比
- 方案一使用Ansible原生模块,日志结构化更强,每个文件的变更都单独记录,排查问题更直观
- 方案二更简洁,但日志是命令原始输出格式,不如原生模块清晰
内容的提问来源于stack exchange,提问作者Trifo
相关产品推荐
相关产品推荐

