Ansible:如何递归设置目录和文件权限


52

Ansible中,我可以这样做:

file: dest=/foo/bar/somedir owner=root group=apache mode=0775 recurse=yes

并将该路径中所有目录和文件的所有者,组和权限递归设置为0775。但是我想将目录设置为0775,将文件设置为0664。是否有某种方法可以做到这一点?


Answers:


33
file: dest=/foo/bar/somedir owner=root group=apache mode=u=rwX,g=rX,o=rX recurse=yes

会将目录设置为755,并将文件设置为644。


这不适用于文件。
米扎

1
@Adam Chance魔术在哪里?如何指定u,g,o使其与数字不同(以及644写入何处?)
linuxbandit

4
源代码提到了ugo的符号处理方式与“ man chmod”的处理方式相同-大写X根据目录/文件状态和现有执行位具有特殊的处理方式。github.com/ansible/ansible/blob/...
马克Tamsky

2
换句话说,Xx目录,而不是文件。这就是方法chmod,不ansible处理模式字符串。我希望S也能得到同样的对待。
x-yuri

1
但是做笔记,这使得通过由业主执行可执行文件的所有
x-yuri

25

Ansible文件/复制模块无法为您提供基于文件类型指定权限的粒度,因此您很可能需要通过以下方式手动执行此操作:

- name: Ensure directories are 0755
  command: find {{ path }} -type d -exec chmod 0755 {} \;

- name: Ensure files are 0644
  command: find {{ path }} -type f -exec chmod 0644 {} \;

这些将具有递归的作用,{{ path }}并将每个文件或目录的权限更改为指定的权限。

资料来源:https : //stackoverflow.com/a/28782805/1306186


@luckytaxi gmangin提供的答案不会递归设置子目录的权限。
Dejay Clayton

嗯,你是对的!我看到了一个recurse选择,但没有另一个选择。
luckytaxi

9

如果要在ansible中使用模块文件,则可以:

文件:dest = / foo / bar / somedir owner = root group = apache mode = 0644 recurse = yes

文件:dest = / foo / bar / somedir owner = root group = apache mode = 0775

使用此方法,首先将所有文件(recurse = yes)设置为“ 644”,然后将/ foo / bar / somedir设置为“ 775”。

这不是完美的,因为它会在每次播放剧本时更改您的目录权限。但是至少它是幂等的,不像module命令那样。

如果您不想更改状态,可以使用模块状态。它会列出/ foo / bar / somedir中的所有文件和目录,以便您注册答案,然后仅在这些文件上循环。


7
您的答案将所有子文件和子目录设置为644,而仅将顶级目录设置为775。需要将所有目录都设置为775,包括子目录。
爱德华·内德·哈维

这个建议不是幂等的。首先将权限设置为一个值,然后再设置为另一个值,这意味着将在每次运行时更改权限。
Kevin Keane

5

我不确定将目录设置为0775(rwxrwxr-x),将文件设置为0644()有多大意义rw-r--r--:可组写的目录而不是文件?

如果您打算将文件设置为0664(rw-rw-r--)以确保在目录可遍历时文件不可执行,那么有一种优雅的解决方案仅涉及一个chmod命令:

chmod -c -R ug=rw,o=r,a-x+X "{{top_dir}}"

这是如何在Ansible中使用

- name: recursive chmod example
  command: |
    chmod -c -R ug=rw,o=r,a-x+X "{{item}}"
  register: chmod_status
  changed_when: chmod_status.stdout != ""
  with_items:
    - "/home/user/sample/dir"

chmod -c打印所有我们可以方便地用于在Ansible中填充“已更改”状态的更改。我希望这是有道理的。


3

仅在需要时更改mod:

- name: make dirs 0755   
  command: find {{ your_path }} -type d ! -perm 0755 -exec chmod 0755 {} \;

- name: make files 0644   
  command: find {{ your_path }} -type f ! -perm 0644 -exec chmod 0644 {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.