Ansible修改权限Playbook无法拦截系统目录下文件问题求助
问题根因
你的拦截逻辑仅会在PATH变量完全匹配列表中的系统根目录时触发终止,当传入/tmp/somefile.txt这类系统目录下的子路径时,路径和列表中的/tmp不完全匹配,因此不会触发拦截规则。
修复方案
你需要调整校验逻辑,从「完全匹配系统目录」改为「校验路径是否处于受保护的系统目录层级下」,同时增加路径标准化逻辑,避免多余斜杠、相对路径等写法绕过校验。
具体修改步骤
- 增加路径标准化处理,消除路径中多余的斜杠、相对路径等歧义写法
- 调整拦截判断逻辑,使用正则匹配所有位于受保护目录下的路径
- 建议修改
PATH变量名,避免和系统环境变量PATH冲突引发未知问题
修改后的关键代码示例
- name: Playbook to change file and directory permissions hosts: '{{ target_hosts }}' vars: # 修改变量名避免和系统环境变量冲突 TARGET_PATH: '{{ target_path }}' PERMISSIONS: '{{ number }}' OWNER: '{{ target_owner }}' GROUP: '{{ target_group }}' # 统一维护受保护的系统目录列表 PROTECTED_DIRS: ["/etc", "/var", "/tmp", "/usr", "/opt", "/home", "/boot"] tasks: - name: 标准化目标路径 set_fact: normalized_path: "{{ TARGET_PATH | ansible.builtin.realpath }}" - name: Checking that it is not a system mount point or its subpath fail: msg: "Changing permissions on system fs and its subpaths is not allowed" when: > normalized_path == '/' or normalized_path is ansible.builtin.match('^(' ~ PROTECTED_DIRS | join('|') ~ ')(/.*)?$') # 后续stat、权限修改的任务保持不变,只需要把原来的PATH替换为TARGET_PATH即可
补充说明
- 正则匹配规则可以同时匹配
/tmp、/tmp/、/tmp/somefile.txt、/etc/nginx等所有受保护目录及其子路径,不会误判/etcd、/varian这类前缀相似的非受保护路径 - 如果需要开放部分受保护目录下的特定子路径,可以在校验条件中追加排除逻辑,比如添加
and not normalized_path starts with '/tmp/allowed_subdir/'即可放开对应路径的修改权限
内容的提问来源于stack exchange,提问作者Fede Berbara
相关产品推荐
相关产品推荐

