问题描述
想要使用Ansible的find
模块创建一个文件列表,然后将该列表传递给file
模块,以更改特定用户拥有的目录中的文件的文件权限。然而,Ansible的find
模块似乎不允许使用所有者或组作为搜索条件。除了所有者之外,文件没有其他可以区分的特征。用户想知道是否有可能实现这个需求,或者是否必须使用shell
模块来实现。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
你可以尝试使用Ansible的stat
模块与find
模块的文件列表进行循环。stat
模块将为你提供pw_name
键,该键可以用于有条件地运行file
模块。
以下是一个示例的Ansible Playbook:
- name: Change file permissions
hosts: your_hosts
tasks:
- name: Find files owned by specific user
find:
paths: /path/to/directory
file_type: file
owner: specific_user
register: found_files
- name: Change file permissions
file:
path: "{{ item.path }}"
owner: specific_user
group: specific_group
mode: specific_mode
loop: "{{ found_files.files }}"
when: item.stat.pw_name == 'specific_user'
在上面的示例中,我们首先使用find
模块查找特定用户拥有的文件,并将结果存储在found_files
变量中。然后,我们使用file
模块循环遍历found_files.files
列表,并根据条件item.stat.pw_name == 'specific_user'
来更改文件的权限。
请注意,你需要将your_hosts
替换为你的目标主机,将/path/to/directory
替换为目标目录的路径,将specific_user
替换为特定用户的用户名,将specific_group
替换为特定组的组名,将specific_mode
替换为特定的文件权限模式。
方案2
使用
command
模块运行find
命令来确定哪些文件属于所需用户,将它们放入一个寄存器,并使用with_items
将该寄存器传递给file
模块。
另一种方法是使用command
模块运行find
命令来确定哪些文件属于所需用户,将它们放入一个寄存器,并使用with_items
将该寄存器传递给file
模块。
以下是一个示例的Ansible Playbook:
- name: Change file permissions
hosts: your_hosts
tasks:
- name: Find files owned by specific user
command: find /path/to/directory -type f -user specific_user
register: found_files
- name: Change file permissions
file:
path: "{{ item }}"
owner: specific_user
group: specific_group
mode: specific_mode
with_items: "{{ found_files.stdout_lines }}"
在上面的示例中,我们使用command
模块运行find
命令来查找特定用户拥有的文件,并将结果存储在found_files
变量中。然后,我们使用file
模块循环遍历found_files.stdout_lines
列表,并根据需要更改文件的权限。
请注意,你需要将your_hosts
替换为你的目标主机,将/path/to/directory
替换为目标目录的路径,将specific_user
替换为特定用户的用户名,将specific_group
替换为特定组的组名,将specific_mode
替换为特定的文件权限模式。