Відповідь: Як рекурсивно встановлювати дозволи для каталогу та файлів


52

У ansible я можу це зробити:

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

І рекурсивно встановлює власника, групу та дозволи на 0775 для всіх каталогів та файлів на цьому шляху. Але я хочу встановити каталоги на 0775, а файли на 0664. Чи є якийсь спосіб зробити так, щоб ansible це зробила?


Відповіді:


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
У вихідному коді зазначається, що символічна обробка угодою є такою ж, як обробка "man chmod" - у капіталу X є спеціальна обробка, заснована на статусі dir / файлу та існуючих бітах виконання. github.com/ansible/ansible/blob/…
Марк Тамський

2
Іншими словами, Xце xдля каталогів, і нічого для файлів. І ось як 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 = коренева група = режим apache = 0644 повторювати = так

файл: dest = / foo / bar / власник somedir = коренева група = режим apache = 0775

За допомогою цього методу ви спочатку встановлюєте весь файл (повтор = = так) на "644", а потім встановлюєте / foo / bar / somedir на "775".

Це не ідеально, тому що воно буде змінювати дозвіл вашого каталогу кожного разу, коли ви граєте в свою книгу. Але принаймні це ідентично, не як команда модуля.

Якщо ви не хочете мати статус "змінити", ви можете використовувати модуль stat. Він перелічить усі файли та каталог у / foo / bar / somedir, щоб ви зареєстрували відповідь і потім зробили цикл лише для цих файлів.


7
Ваша відповідь встановить усі підкаталоги та підкаталоги на 644, встановивши лише для каталогу верхнього рівня 775. Потрібно, щоб усі каталоги були 775, включаючи підкаталоги.
Едвард Нед Харві

Ця пропозиція не є безсильною. Встановлення дозволів спочатку на одне значення, а пізніше на інше, означає, що дозволи будуть змінюватися під час кожного запуску.
Кевін Кін

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

Щоб змінити моди лише за потреби:

- 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 {} \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.