Как выполнить рекурсию в каталоге, избегая дублирования - PullRequest
1 голос
/ 27 апреля 2019

Используя состояния SaltStack, я пытаюсь рекурсивно установить разрешения для файлов и каталогов с некоторым исключением.

У меня есть файловая структура, подобная следующей:

  • / dir1 / file1
  • / dir1 / file2_untouch
  • / dir1 / dir2 / file3
  • / dir1 / dir2 / file4_untouch
  • / dir1 / dir3 / file5
  • / dir1 / dir3 / file6

При следующем состоянии почти все (кроме исключения) выполняется правильно, но одинаковые перекрытия появляются при каждом выполнении , потому что / dir1 устанавливает 0644 и / dir1 / dir3 установить 0755 снова.

config_dirs:
  file.directory:
    - user: user1
    - group: user1
    - dir_mode: '0755'
    - exclude_pat: file*_untouch
    - recurse:
      - user
      - group
      - mode
    - names:
      - /dir1:
        - file_mode: '0644'
      - /dir1/dir3:
        - file_mode: '0755'

Хотелось бы получить следующие результаты:

  • Установить разрешение 0644 для каждого файла в / dir1 / dir3 ;
  • Оставьте без изменений файлы с шаблоном file * _untouch ;
  • Установить разрешение 0644 для всех остальных файлов;
  • Установить разрешение 0755 для всех остальных каталогов;

1 Ответ

0 голосов
/ 14 июня 2019

Опция exclude_pat file.directory применяется только к функциональности clean. Фактически, модуль состояния file.directory выполняет chmod/chown действия только как побочную работу, а не очень хорош в этом .

Чтобы достичь желаемых действий chmod/chown с сохранением состояния, вы можете обойти ограничения file.directory, например:

config_dirs_dir_ownerships:
  cmd.run:
    - name: "find /dir1 -type d -exec chmod 755 {} \\; -exec chown user1:user1 {} \\;"
    - onlyif: "find /dir1 -type d -not \\( -perm 755 -a -user user1 -a group user1 \\) |grep ."

config_dirs_file_ownerships:
  cmd.run:
    - name: "find /dir1 -type f -not -name 'file*_untouch' -exec chmod 644 {} \\; -exec chown user1:user1 {} \\;"
    - onlyif: "find /dir1 -type f -not -name 'file*_untouch' -not \\( -perm 644 -a -user user1 -group user1 \\) |grep ."

Если это слишком "хакерский", вам следует подумать о написании простого пользовательского модуля для него. os.walk должен выполнить эту работу, и на самом деле это не так сложно реализовать. Следующая лучшая документация для пользовательских модулей: https://pyholodeck.readthedocs.io/en/latest/first_module.html

...