Как установить Python на большое количество хостов для использования Ansible на них

«Как установить Python на большое количество хостов для использования Ansible на них» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для управления множеством хостов через 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

Ключевые моменты из моего опыта:

  1. gather_facts: no в начале критически важно, чтобы плейбук не упал на первом же шаге.
  2. После успешной установки Python нужно вызвать модуль setup для сбора фактов, чтобы последующие задачи могли использовать переменные, такие как ansible_os_family.
  3. Для дальнейшей установки пакетов на Debian-based системах часто требуется также пакет python3-apt, чтобы модуль apt Ansible работал корректно.
  4. Этот подход позволяет автоматизировать подготовку всей инфраструктуры из единой точки управления, что является основополагающим принципом в DevOps.