Ansible: Как рекурсивно установить права доступа к файлам и каталогам

61095
Edward Ned Harvey

В ansible я могу сделать это:

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

И он рекурсивно устанавливает владельца, группу и разрешения на 0775 для всех каталогов и файлов по этому пути. Но я хочу установить для каталогов значение 0775, а для файлов - 0664. Есть ли какой-нибудь способ сделать это доступным?

35
Связано: [Изменить все разрешения для папок одной командой] (https://unix.stackexchange.com/q/349053/23408#349063). Scott 6 лет назад 0

5 ответов на вопрос

17
Zulakis

The Ansible file/copy modules don't give you the granularity of specifying permissions based on file type so you'd most likely need to do this manually by doing something along these lines:

- 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 {} \; 

These would have the effect of recursing through {{ path }} and changing the permissions of every file or directory to the specified permissions.

Source: https://stackoverflow.com/a/28782805/1306186

@luckytaxi ответ, предоставленный gmangin, не рекурсивно устанавливает права доступа к подкаталогам. Dejay Clayton 7 лет назад 0
аааа ты прав! я видел один вариант "recurse", но не другой. luckytaxi 7 лет назад 0
13
Adam Chance
file: dest=/foo/bar/somedir owner=root group=apache mode=u=rwX,g=rX,o=rX recurse=yes 

установит каталоги на 755, а файлы на 644.

Проверено. Отлично. Спасибо. :-) Edward Ned Harvey 6 лет назад 0
это не работает для файлов. motto 6 лет назад 0
@ Adam Chance Где магия? Как указание u, g, o делает его отличным от числа (и где написано 644?) linuxbandit 6 лет назад 0
В исходном коде упоминается, что символическая обработка ugo аналогична обработке man chmod - заглавная X имеет специальную обработку, основанную на статусе dir / file и существующих битах выполнения. https://github.com/ansible/ansible/blob/8606fb33f0e8954b588eaecec2d99b4a120fd4ad/lib/ansible/module_utils/basic.py#L1419-L1421 Marc Tamsky 6 лет назад 2
9
gmangin

Если вы хотите использовать файл модуля в ansible, вы можете:

файл: dest = / foo / bar / somedir владелец = корневая группа = режим apache = 0644 recurse = yes

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

С помощью этого метода вы сначала устанавливаете весь файл (recurse = yes) на «644», а затем устанавливаете / foo / bar / somedir на «775».

Это не идеально, потому что это будет изменять ваши права доступа к каталогу каждый раз, когда вы играете в свою книгу. Но, по крайней мере, это идемпотент, а не команда модуля.

Если вы не хотите иметь «измененный» статус, вы можете использовать модуль stat. Он перечислит все файлы и каталог в / foo / bar / somedir, поэтому вы регистрируете ответ и затем делаете цикл только для этих файлов.

Ваш ответ установит для всех подфайлов и подкаталогов значение 644, а для каталога только верхнего уровня - 775. Необходимо, чтобы все * каталоги * были равны 775, включая подкаталоги. Edward Ned Harvey 8 лет назад 6
5
Onlyjob

Я не уверен, какой смысл в том, чтобы устанавливать для каталогов значение 0775 ( rwxrwxr-x), а для файлов - 0644 ( rw-r--r--): каталоги с возможностью записи в группы, но не файлы?

Если вы намеревались установить для файлов значение 0664 ( rw-rw-r--), чтобы гарантировать, что файлы не будут выполняться, а каталоги можно обойти, то есть элегантное решение, включающее только одну chmodкоманду:

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

Вот как это можно использовать в Ansible :

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

chmod -cпечатает все изменения, которые мы можем удобно использовать для заполнения «измененного» статуса в Ansible . Я надеюсь, что это имеет смысл.

3
sjas

Чтобы изменить моды только при необходимости:

- 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 {} \;