You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:27:40