Как использовать подстановочные пути с модулем Ansible `find`? - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь удалить оставшиеся файлы из нескольких каталогов на удаленном хосте , используя Ansible playbook.

/some_dir
├── dir_1
│   └── file_A
├── dir_2
│   └── file_B
└── dir_3
    └── file_C

Если бы я использовал сценарий оболочки, например, я бы использовал простой глобус, такой как rm -rf /some_dir/dir_*/file_*, он достаточно специфичен. Я хотел бы придерживаться лучших методов Ansible ™, поэтому я решил пойти с комбинацией find и file модулей.

tasks:
  - name: Find files to remove by patterns
    find:
      paths: "/some_dir/dir_*/"
      patterns: "file_*"

Однако подстановочные знаки, похоже, не работают в find paths, они считаются буквальными.

Есть ли способ обойти эти ограничения?

Примечания:

  1. Я понимаю, что я мог бы искать file_[A-Z] в some_dir рекурсивно, но тогда он мог бы перехватить /some_dir/very_important_stuff/file_0 (я воспользуюсь этим решением, если все остальное не поможет)
  2. Возможно, я могу использовать команды оболочки или сценарии, чтобы использовать расширение оболочки на удаленном хосте, а затем проанализировать его стандартный вывод, чтобы получить список файлов, но это звучит как склонный к ошибкам хак
  3. В этом конкретном случае я могу запустить две find задачи: найти все dir_* в some_dir, затем использовать их как список paths, чтобы найти file_* с, но, поскольку эта задача (и) ) это часть большого реального плейбука, его будет слишком сложно использовать для путей с подстановочными знаками в произвольных позициях (/some_dir/dir_*/other/cruft/subdirs/*.cache).

1 Ответ

0 голосов
/ 21 января 2019

Невозможно напрямую.Вы можете пойти с shell командой:

---
- name: TEST
  hosts: host1
  gather_facts: False

  tasks:
  - name: shell
    shell: "ls -1 /some_dir/dir_*/*"
    register: result

  - name: debug
    debug:
      var: result.stdout
...