41

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

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

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

5 ответов5

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

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

20

Модули 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

9

Если вы хотите использовать файл модуля в 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, поэтому вы регистрируете ответ и затем делаете цикл только для этих файлов.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .