Как централизованно управлять устройствами с разными версиями Python с помощью Ansible 2.15
Что проверяют
Понимаете ли вы, как Ansible выбирает интерпретатор Python на целевых хостах и что ansible_python_interpreter решает большинство проблем разнородного парка. Следом спрашивают, что делать с хостом, где Python нет вовсе, и что сломается при обновлении ansible-core.
Как отвечать
Сначала разделите два Python. На контроллере он нужен самому Ansible: ansible-core 2.15 требует 3.9 или новее. На управляемых узлах модули исполняются тем интерпретатором, который Ansible там найдёт, и для 2.15 это Python 2.7 или 3.5 и выше.
- обнаружение: по умолчанию
interpreter_python = auto. Ansible перебирает известные пути для дистрибутива и предупреждает, если выбор неочевиден.auto_silentубирает предупреждение, но не саму проблему; - явное указание:
ansible_python_interpreterвgroup_varsиhost_vars, например/usr/bin/python3для новых систем и/usr/bin/python2.7для старых; - группировка по факту: после сбора фактов модуль
group_byс ключом вродеpy{{ ansible_facts.python.version.major }}раскладывает хосты по группам, дальше у каждой свои переменные и задачи; - хосты без Python:
gather_facts: false, установка через модульraw, потом явныйsetup; - сетевые устройства: при
network_cliиhttpapiмодули выполняются на контроллере, Python на самом устройстве не нужен.
Python для приложений держите отдельно от системного: пакеты дистрибутива или собранная версия в своём каталоге, зависимости через модуль pip с параметрами virtualenv и virtualenv_command. Контроллер удобно зафиксировать в execution environment, контейнере со своими версиями Python, ansible-core и коллекций.
Где спотыкаются
Ставят Python через command: pyenv install без creates. Задача меняет систему при каждом прогоне, идемпотентность потеряна.
Подменяют системный python3 на свой. После этого ломаются пакетный менеджер и модули apt и dnf, которым нужны системные биндинги.
Не учитывают поддержку версий: ветка 2.15 уже снята с поддержки, а ansible-core 2.17 перестал работать с Python 2.7 и 3.6 на узлах. Старые хосты придётся обновить или оставить на старом контроллере.