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

Edw*_*vey 75 file-permissions ansible

在ansible中,我可以这样做:

file: dest=/foo/bar/somedir owner=root group=apache mode=0775 recurse=yes
Run Code Online (Sandbox Code Playgroud)

并且它递归地将该路径中的所有目录和文件的所有者、组和权限设置为 0775。但是我想将目录设置为 0775,将文件设置为 0664。有什么方法可以让 ansible 做到这一点?

小智 70

file: dest=/foo/bar/somedir owner=root group=apache mode=u=rwX,g=rX,o=rX recurse=yes
Run Code Online (Sandbox Code Playgroud)

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

  • 换句话说,对于目录,`X` 是 `x`,对于文件则没有。这就是 [`chmod`](https://jlk.fjfi.cvut.cz/arch/manpages/man/core/coreutils/chmod.1.en) 而不是 `ansible` 处理模式字符串的方式。我希望“S”也能得到同样的对待。 (10认同)
  • 源代码提到符号 ugo 处理与“man chmod”的处理相同——大写 X 具有基于目录/文件状态和现有执行位的特殊处理。https://github.com/ansible/ansible/blob/8606fb33f0e8954b588eaecec2d99b4a120fd4ad/lib/ansible/module_utils/basic.py#L1419-L1421 (9认同)
  • @Adam Chance 魔力在哪里?指定 u,g,o 如何使它与数字不同(644 写在哪里?) (3认同)
  • 这不适用于文件。 (2认同)
  • 但请注意,它使文件可由所有者执行 [all](/sf/ask/2014511691/#comment95518029_29793833 )。 (2认同)

Zul*_*kis 28

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 {} \;
Run Code Online (Sandbox Code Playgroud)

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

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


gma*_*gin 12

如果你想在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”。

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

如果您不想拥有“已更改”状态,则可以使用模块 stat。它将列出 /foo/bar/somedir 中的所有文件和目录,以便您注册答案,然后仅对这些文件进行循环。

  • 您的回答会将所有子文件和子目录设置为 644,而仅将顶级目录设置为 775。需要将所有 *目录* 设置为 775,包括子目录。 (7认同)
  • 这个建议不是幂等的。首先将权限设置为一个值,然后再设置为另一个值,这意味着每次运行时都会更改权限。 (2认同)

sja*_*jas 6

仅在需要时更改模组:

- 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 {} \;
Run Code Online (Sandbox Code Playgroud)


Onl*_*job 5

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

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

chmod -c -R ug=rw,o=r,a-x+X "{{top_dir}}"
Run Code Online (Sandbox Code Playgroud)

以下是它在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"
Run Code Online (Sandbox Code Playgroud)

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