ansible пипс: рекурсивно установить колеса в виртуал - PullRequest
0 голосов
/ 25 апреля 2020

Чтобы установить все колеса из папки /tmp/prod_wheel/ Я делаю это:

$ cat playbook_install.yml
---
- hosts: localhost
  tasks:

    - name: Install all wheels
      pip:
        name: "{{ query('fileglob', '/tmp/prod_wheel/*.whl') }}"
        virtualenv: "~/venv"
        virtualenv_command: /usr/bin/python3 -m venv ~/venv

Работает хорошо.

Теперь у меня есть ситуация, когда колеса находятся в папках. известные имена, например, /tmp/data/*/*.whl fileglob не перетаскивает папки (только файлы).

Я использую find, чтобы поймать колеса, но какой более компактный способ установить их в моем virtualenv?

$ echo playbook_catch_wheels.yml
---
- hosts: localhost
  tasks:

    - name: Find to catch recursively all wheels
      find:
        paths: /vagrant/vagrant/*/dist/
        patterns: '*.whl'

1 Ответ

1 голос
/ 26 апреля 2020

Вы можете просто извлечь список путей из результата find с помощью фильтра map и передать его в pip, как вы делали это ранее при поиске fileglob.

Принимая как должное ваше фактическое find задание, возвращает то, что вы ожидаете (я все еще добавил recurse, так как вы упомянули об этом), следующие две задачи должны соответствовать вашему требованию:

---
- hosts: localhost
  tasks:

    - name: Find to catch recursively all wheels
      find:
        paths: /vagrant/vagrant/*/dist/
        patterns: '*.whl'
        recurse: true
      register: wheel_search

    - name: Install all found wheels
      pip:
        name: "{{ wheel_search.files | map(attribute='path') | list }}"
        virtualenv: "~/venv"
        virtualenv_command: /usr/bin/python3 -m venv ~/venv

Обратите внимание, что Решение find гораздо более переносимо, чем поиск fileglob, поскольку при необходимости оно будет работать на удаленном хосте. Поиск всегда выполняется локально, тогда как поиск выполняется на целевом хосте.

...