Правильный способ настройки среды при разработке пользовательских модулей ANSI, использующих сторонние библиотеки Python - PullRequest
0 голосов
/ 11 июня 2019

Я разработал пользовательский модуль ANSIBLE, который зависит от сторонней библиотеки PyYAML.Однако при запуске playbook выдается

ansible_module_my_module.py, line 5, in <module>
  import yaml
ImportError: No module named yaml

. Я вижу PyYAML в файле ansible needs.txt (https://github.com/ansible/ansible/blob/stable-2.8/requirements.txt), поэтому я знаю, что он установлен / используется на хост-компьютере. Мне интересно, есть лирекомендуемый способ установить его на удаленном компьютере?

Я могу добавить шаг в playbook, используя модуль pip ansible, чтобы установить его на удаленный компьютер. Что-то вроде

- hosts: all
  tasks:
  - name: Installing PyYAML python library using Ansible pip module
    pip:
      name: PyYAML

Но это значитplaybook знает подробности реализации о модулях, спрятанных глубоко в стеке, что кажется неправильным. Я ожидаю, что есть какой-то способ сказать ansible установить сторонние библиотеки на удаленной машине как часть его установки. Например, добавление require.txtв моем модуле ansible добавляет его к настройке, но я не могу найти элегантный способ сделать это. Любая помощь приветствуется.

1 Ответ

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

Первое обнаружение зависимостей и их автоматическая установка противоречит философии их установки на хостах как можно меньше. Чтобы обойти это, я обернул свой пользовательский модуль в роль и передал переменные этой роли, а не непосредственно модулю. Таким образом, пользователи устанавливают переменные роли и вызывают его, используя include_role и tasks_from, после включения его в свои require.yml Затем я использовал модуль pip (https://docs.ansible.com/ansible/latest/modules/pip_module.html)), чтобы настроить среду как задачу в роли перед задачей, которая вызывает мой пользовательский модуль.

Вторая проблема, с которой я столкнулся, заключалась в том, что ansible будет по умолчанию использовать /usr/bin/python даже при выполнении через virtualenv. Это, очевидно, спроектированное поведение. Чтобы обойти это, я должен был включить ansible_python_interpreter, чтобы вручную установить его в virtualenv при локальном запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...