Ansible playbook “chmod” работает с небольшими деревьями каталогов, но зависает на больших деревьях каталогов.

Вопрос или проблема

Мы пытаемся держать файлы и папки в одной группе, чтобы все пользователи, подключающиеся к нашей chroot директории SFTP, имели доступ к одним и тем же папкам. Мы используем группу по умолчанию, назначенную при входе для всех пользователей, поэтому мы стараемся сохранить одну и ту же группу. Это не наш выбор, это было требование поставщика по группе по умолчанию. Некоторые пользователи не устанавливают правильные группу / разрешения при создании папок или записи файлов. Наше значение по умолчанию для записи файлов – 0755, и нам нужно переопределить это в этой chroot файловой системе. Мы не хотим изменять какие-либо скрытые файлы и папки. Следующие задачи Ansible работают нормально при работе с маленькой файловой системой, но при применении к более крупной файловой системе мы получаем следующую ошибку:



ЗАДАЧА [manage_directories : Рекурсивно изменить владельца | chmod_files_folders_recursively.yml 21]
ОШИБКА! Рабочий процесс оказался в мертвом состоянии


Похоже, что не хватает памяти или происходит переполнение стека. Мы подтвердили, что задача запускается с помощью strace, но не видим, чтобы память значительно увеличивалась на машине при наблюдении за htop. Снова, это работает нормально на меньшем подмножестве файлов / папок, только не в основной директории с около 144K объектов.


  • имя: Рекурсивно найти все файлы | chmod_files_folders_recursively.yml 1
    find:
    путь: /some/specific/path
    тип_файла: любой
    скрытый: ложь
    рекурсивно: истина
    зарегистрировать: содержимое_папки

  • имя: Рекурсивно изменить владельца | chmod_files_folders_recursively.yml 21
    файл:
    путь: “{{ item.path }}”
    группа: somegroup
    режим: ‘2775’
    цикл: “{{ folder_contents.files }}”


Ответ или решение

Решение проблемы с Ansible Playbook для изменения прав доступа на больших директориях

Введение

В процессе работы с Ansible для управления правами доступа в среде SFTP, возникла проблема при обработке больших директорий с количеством объектов около 144,000. Несмотря на то, что проявлялся успех при работе с меньшими подмножествами файлов и папок, Playbook выдавал ошибку: "ERROR! A worker was found in a dead state". В этом ответе мы рассмотрим, как справиться с данной проблемой.

Причины проблемы

Судя по всему, указанная ошибка связана с несколькими возможными факторами:

  1. Нагрузка на память и ресурсы: Когда обрабатывается большое количество файлов и директорий, Ansible может сталкиваться с ограничениями на ресурсы, поскольку каждая задача требует системных ресурсов для выполнения.

  2. Переполнение стека: В случае большого количества рекурсивных вызовов возможно переполнение стека, что может привести к сбоям в работе.

  3. Ограничения на количество операций: Операции с файлами могут ограничиваться ОС (например, лимиты по количеству открытых дескрипторов файлов).

Рекомендации по оптимизации

1. Пакетная обработка файлов

Вместо обработки файлов по одному, что может быть неэффективно на больших очередях, стоит рассмотреть возможность пакетной обработки. Это снизит количество циклов выполнения:

- name: Recursively find all files
  find:
    path: /some/specific/path
    file_type: any
    hidden: false
    recurse: true
  register: folder_contents

- name: Set group and permissions
  command: chgrp -R somegroup {{ item }} && chmod -R 2775 {{ item }}
  with_items: "{{ folder_contents.files | map(attribute='path') | list }}"
  when: item is not match('\.hidden')

2. Использование shell вместо модуля file

Вместо использования модуля file, который может требовать большей памяти при большом количестве элементов, вы можете использовать команду shell для выполнения команд:

- name: Recursively change group and permissions using shell
  shell: |
    find /some/specific/path -type d -exec chgrp somegroup {} \; -exec chmod 2775 {} \; 
    find /some/specific/path -type f -exec chgrp somegroup {} \; -exec chmod 2775 {} \;
  args:
    warn: false

3. Исполнение в фоновом режиме

Если вы все еще сталкиваетесь с проблемами памяти, попробуйте разбивать ваши задачи на несколько этапов и исполнять их асинхронно:

- name: Recursively change group and permissions asynchronously
  shell: |
    find /some/specific/path -exec chgrp somegroup {} \; & 
    find /some/specific/path -exec chmod 2775 {} \; & 
  async: 600
  poll: 0

4. Увеличение системных ресурсов

Если возможно, увеличьте выделяемые ресурсы для Ansible или на самой машине. Это может включать в себя:

  • Увеличение оперативной памяти.
  • Увеличение лимита на количество открытых файлов (можно настроить с помощью ulimit).
  • Оптимизация работы операционной системы.

Заключение

Ваши проблемы с Ansible playbook при работе с большими директориями могут быть решены с помощью вышеуказанных методов. Основная цель — оптимизация процессов, чтобы избежать излишней нагрузки на память и ресурсы системы. Следуя представленным советам, вы сможете успешно управлять правами доступа к объектам в вашей SFTP среде без ошибок и с наименьшими затратами времени.

Оцените материал
Добавить комментарий

Капча загружается...