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

52

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

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

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

Эдвард Нед Харви
источник

Ответы:

34
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 имеет специальную обработку, основанную на статусе dir / file и существующих битах выполнения. 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

Zulakis
источник
@luckytaxi ответ, предоставленный gmangin, не рекурсивно устанавливает права доступа к подкаталогам.
Деджей Клейтон,
аааа ты прав! Я видел один recurseвариант, но не другой.
luckytaxi
9

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

file: dest = / foo / bar / somedir owner = корневая группа = режим apache = 0644 recurse = yes

file: dest = / foo / bar / somedir owner = корневая группа = apache mode = 0775

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

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

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

gmangin
источник
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 . Я надеюсь, что это имеет смысл.

Onlyjob
источник
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 {} \;
sjas
источник