Ответ
Для управления множеством хостов через Ansible, Python должен быть установлен на каждом целевом узле. Я решаю эту задачу с помощью самого Ansible, используя его raw модуль для начальной загрузки (bootstrapping), так как он не требует установленного Python для выполнения.
Вот пример плейбука, который сначала проверяет наличие Python, а при необходимости устанавливает его, учитывая разные семейства ОС:
---
- name: Bootstrap Python3 on target hosts
hosts: all
become: yes
gather_facts: no # Факты собрать пока нельзя, т.к. Python может отсутствовать
tasks:
- name: Check if Python3 is already installed
raw: which python3 || which python
register: python_check
changed_when: false
ignore_errors: true
- name: Install Python3 on Debian/Ubuntu hosts
raw: apt-get update && apt-get install -y python3 python3-apt
when: python_check.rc != 0 and ansible_distribution in ['Debian', 'Ubuntu']
- name: Install Python3 on RHEL/CentOS/Rocky/AlmaLinux hosts
raw: yum install -y python3
when: python_check.rc != 0 and ansible_distribution in ['CentOS', 'RedHat', 'Rocky', 'AlmaLinux']
- name: Enable fact gathering for the rest of the playbook
setup:
when: python_check.rc == 0
Ключевые моменты из моего опыта:
gather_facts: noв начале критически важно, чтобы плейбук не упал на первом же шаге.- После успешной установки Python нужно вызвать модуль
setupдля сбора фактов, чтобы последующие задачи могли использовать переменные, такие какansible_os_family. - Для дальнейшей установки пакетов на Debian-based системах часто требуется также пакет
python3-apt, чтобы модульaptAnsible работал корректно. - Этот подход позволяет автоматизировать подготовку всей инфраструктуры из единой точки управления, что является основополагающим принципом в DevOps.