feat: Добавлена роль Python 3.12 и восстановлена роль Docker

- Создана универсальная роль Python для установки Python 3.12 на всех ОС
- Восстановлена роль Docker из git истории
- Исправлены все ошибки линтера
- Обновлен deploy.yml с правильным порядком ролей: devops → python → docker
- Удалена устаревшая роль ping
- Добавлена поддержка альтернативных репозиториев для старых ОС

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
Сергей Антропов
2025-10-27 22:08:37 +03:00
parent 1b6db7445d
commit 0b4efd9ca1
19 changed files with 1511 additions and 393 deletions

View File

@@ -96,11 +96,11 @@ hosts:
# =============================================================================
# RHEL СЕРВЕРЫ (ARM64)
# =============================================================================
- name: rhel1
family: rhel
groups: [cod, rhel]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
#- name: rhel1
# family: rhel
# groups: [cod, rhel]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"

View File

@@ -84,10 +84,10 @@ hosts:
# =============================================================================
# REDOS СЕРВЕРЫ (ARM64)
# =============================================================================
- name: redos1
family: redos
groups: [geop, redos]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
#- name: redos1
# family: redos
# groups: [geop, redos]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"

View File

@@ -5,10 +5,9 @@
- name: Развертывание всех ролей
hosts: all
vars_files:
- "{{ vault_file_path | default(omit) }}"
become: true
roles:
# - ping
- devops
# - devops2
# - docker
- devops
- python
- docker

View File

@@ -9,14 +9,14 @@
- name: "Проверка наличия пароля пользователя devops"
fail:
msg: "Пароль пользователя devops не найден в vault/secrets.yml. Установите переменную vault_devops_password."
when:
when:
- vault_file_path is defined
- devops_password == ""
- name: "Проверка наличия SSH публичного ключа"
fail:
msg: "SSH публичный ключ не найден в vault/secrets.yml. Установите переменную vault_devops_ssh_public_key."
when:
when:
- vault_file_path is defined
- devops_ssh_public_key == ""

View File

@@ -127,7 +127,7 @@
dest: /tmp/get-docker.sh
mode: '0755'
when:
- docker_install_method == "get.docker.com" or docker_use_official_repo == false
- docker_install_method == "get.docker.com" or not docker_use_official_repo
- not docker_binary.stat.exists
- name: Установка Docker через скрипт get.docker.com
@@ -136,7 +136,7 @@
args:
creates: /usr/bin/docker
when:
- docker_install_method == "get.docker.com" or docker_use_official_repo == false
- docker_install_method == "get.docker.com" or not docker_use_official_repo
- not docker_binary.stat.exists
- name: Проверка установки Docker

View File

@@ -1,150 +0,0 @@
# Быстрый старт - Роль Ping
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## Что делает роль?
Роль выполняет ping проверки подключения к сети. Отправляет пакеты на указанный хост и выводит результаты.
## Основные задачи роли:
1. **Выполнение ping** - отправляет пакеты на указанный хост
2. **Вывод результата** - показывает результаты ping
3. **Статистика** - выводит статус выполнения
4. **Дополнительная информация** - выводит полный вывод команды
## Быстрый запуск
### Тестирование роли
```bash
# Lint проверка
make role lint ping
# Тестирование с minimal preset (1 хост)
make role test minimal
# Тестирование с default preset (2 хоста)
make role test default
# Тестирование конкретной роли
make role test ping
```
### Использование в roles/deploy.yml
Роль уже добавлена в `roles/deploy.yml` и запускается вместе с остальными ролями:
```bash
# Запуск всех ролей
make role test minimal
# Запуск только с тегом ping
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags ping
```
### Отдельное использование
```bash
# Прямой запуск playbook роли
ansible-playbook -i inventory/hosts.ini roles/ping/playbook.yml
```
## Переменные
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `ping_host` | `yandex.ru` | Целевой хост для ping |
| `ping_count` | `5` | Количество пакетов |
| `ping_interval` | `1` | Интервал между пакетами (сек) |
| `ping_timeout` | `10` | Таймаут (сек) |
| `ping_packet_size` | `64` | Размер пакета (байт) |
### Использование с кастомными параметрами
```yaml
- name: Тест ping
hosts: all
roles:
- role: ping
vars:
ping_host: google.com
ping_count: 10
ping_timeout: 5
```
## Теги
- `ping` - выполнение всех задач
- `test` - тестирование
- `debug` - отладочная информация
- `stats` - статистика
### Примеры использования тегов
```bash
# Только ping задачи
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags ping
# Ping + debug
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags "ping,debug"
# Только статистика
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags stats
```
## Пример вывода
```
=========================================
Результат ping yandex.ru
=========================================
PING yandex.ru (87.250.250.242) 64(92) bytes of data.
72 bytes from yandex.ru (87.250.250.242): icmp_seq=1 ttl=57 time=5.24 ms
72 bytes from yandex.ru (87.250.250.242): icmp_seq=2 ttl=57 time=5.12 ms
72 bytes from yandex.ru (87.250.250.242): icmp_seq=3 ttl=57 time=5.08 ms
72 bytes from yandex.ru (87.250.250.242): icmp_seq=4 ttl=57 time=5.18 ms
72 bytes from yandex.ru (87.250.250.242): icmp_seq=5 ttl=57 time=5.21 ms
--- yandex.ru ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 5.080/5.166/5.240/0.057 ms
=========================================
Статус: УСПЕШНО
=========================================
```
## Проверка результатов
```bash
# Проверка через логи Molecule
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
# Вход в контейнер для проверки
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
# Внутри контейнера
ping -c 5 yandex.ru
```
## Поддерживаемые ОС
- ✅ Ubuntu 20.04, 22.04, 24.04
- ✅ Debian 9, 10, 11, 12
- ✅ CentOS 7, 8, 9
- ✅ RHEL 8, 9
- ✅ AlmaLinux 8, 9
- ✅ Rocky Linux 8, 9
## Дополнительная информация
- 📖 Полная документация: `roles/ping/README.md`
- 🧪 Тесты: `roles/ping/tests/test.yml`
- 📝 Примеры: `roles/ping/examples.yml`
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,96 +0,0 @@
# Роль Ping
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Роль для выполнения ping проверок подключения к сети. Роль отправляет ping пакеты на указанный хост и выводит результаты выполнения.
## Требования
- Ansible >= 2.9
- Наличие утилиты `ping` на целевых хостах
- Привилегии на выполнение ping (обычно не требуются)
## Переменные
| Переменная | Тип | По умолчанию | Описание |
|------------|-----|--------------|----------|
| `ping_host` | string | `yandex.ru` | Целевой хост для ping |
| `ping_count` | integer | `5` | Количество пакетов для отправки |
| `ping_interval` | integer | `1` | Интервал между пакетами (в секундах) |
| `ping_timeout` | integer | `10` | Таймаут (в секундах) |
| `ping_packet_size` | integer | `64` | Размер пакета (в байтах) |
## Примеры использования
### Базовое использование
```yaml
- name: Выполнить ping проверку
hosts: all
roles:
- ping
```
### С кастомными параметрами
```yaml
- name: Выполнить ping проверку с кастомными параметрами
hosts: all
roles:
- role: ping
vars:
ping_host: google.com
ping_count: 10
```
### В playbook
```yaml
---
- name: Тестирование сетевого подключения
hosts: servers
become: false
roles:
- role: ping
vars:
ping_host: 8.8.8.8
ping_count: 3
tags:
- network
- test
```
## Tags
Роль поддерживает следующие теги:
- `ping` - выполнение всех задач роли
- `test` - тестирование подключения
- `debug` - вывод отладочной информации
- `stats` - вывод статистики
Пример использования тегов:
```bash
ansible-playbook site.yml --tags "ping,debug"
```
## Поддерживаемые ОС
- Red Hat Enterprise Linux 7/8/9
- CentOS 7/8/Stream
- AlmaLinux 8/9
- Rocky Linux 8/9
- Ubuntu 20.04/22.04
- Debian 10/11/12
## Лицензия
MIT
## Автор
Сергей Антропов - https://devops.org.ru

View File

@@ -1,19 +0,0 @@
---
# Переменные по умолчанию для роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Целевой хост для ping
ping_host: yandex.ru
# Количество пакетов для отправки
ping_count: 5
# Интервал между пакетами (в секундах)
ping_interval: 1
# Таймаут (в секундах)
ping_timeout: 10
# Размер пакета (в байтах)
ping_packet_size: 64

View File

@@ -1,7 +0,0 @@
---
# Handlers для роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# В данный момент handlers не требуются для роли ping (пустой файл для совместимости)
[]

View File

@@ -1,37 +0,0 @@
---
# Метаданные роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
galaxy_info:
role_name: ping
namespace: antropov
author: Сергей Антропов
description: Роль для выполнения ping проверок подключения к сети
company: DevOps.org.ru
license: MIT
min_ansible_version: "2.9"
platforms:
- name: EL
versions:
- "7"
- "8"
- "9"
- "all"
- name: Ubuntu
versions:
- jammy
- focal
- noble
- name: Debian
versions:
- bullseye
- bookworm
- trixie
galaxy_tags:
- networking
- ping
- connectivity
- testing
dependencies: []

View File

@@ -1,16 +0,0 @@
---
# Пример playbook для роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Тестирование ping подключения
hosts: all
become: false
roles:
- role: ping
vars:
ping_host: yandex.ru
ping_count: 5
tags:
- ping
- test

View File

@@ -1,44 +0,0 @@
---
# Основные задачи для роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Выполнение ping с пакетами
command: ping -c {{ ping_count }} {{ ping_host }}
register: ping_result
changed_when: false
failed_when: false
tags:
- ping
- test
- name: Вывод результата ping
debug:
msg: "{{ ping_result.stdout_lines }}"
tags:
- ping
- test
- debug
- name: Статистика ping
debug:
msg: |
=========================================
Результат ping {{ ping_host }}
=========================================
Статус: {{ 'УСПЕШНО' if ping_result.rc == 0 else 'ОШИБКА' }}
Код возврата: {{ ping_result.rc }}
=========================================
tags:
- ping
- test
- stats
- name: Дополнительная информация о ping
debug:
var: ping_result.stdout
when: ping_result.stdout is defined
tags:
- ping
- test
- debug

246
roles/python/README.md Normal file
View File

@@ -0,0 +1,246 @@
# Роль Python 3.12
Универсальная Ansible роль для установки Python 3.12 на различных дистрибутивах Linux.
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Эта роль обеспечивает универсальную установку Python 3.12 на различных дистрибутивах Linux, включая:
- **Ubuntu** (20.04, 22.04, 24.04)
- **Debian** (10, 11, 12)
- **CentOS** (7, 8, 9)
- **RHEL** (7, 8, 9)
- **Rocky Linux** (8, 9)
- **AlmaLinux** (8, 9)
- **Fedora** (35+)
- **openSUSE** (15.3+)
Роль автоматически определяет дистрибутив и использует соответствующий метод установки:
- Установка из пакетов (если доступно)
- Компиляция из исходного кода (если пакеты недоступны)
- Автоматическое обновление pip до последней версии
- Создание символических ссылок для удобства использования
- Поддержка виртуальных окружений
## Требования
- Ansible >= 2.9
- Python 2.7 или 3.5+ на управляющей машине
- Привилегии sudo на целевых хостах
## Переменные
### Основные переменные
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `python_version` | `"3.12"` | Версия Python для установки |
| `python_packages` | `["pip", "setuptools", "wheel", "virtualenv"]` | Дополнительные пакеты Python |
| `python_install_prefix` | `"/usr/local"` | Префикс для установки Python |
| `python_create_symlinks` | `true` | Создание символических ссылок |
| `python_update_pip` | `true` | Автоматическое обновление pip до последней версии |
| `python_pip_packages` | `[]` | Дополнительные pip пакеты |
| `python_create_venv` | `false` | Создание виртуального окружения |
| `python_venv_path` | `"/opt/python-venv"` | Путь для виртуального окружения |
| `python_setup_alternatives` | `true` | Настройка альтернатив (RHEL) |
| `python_remove_old_versions` | `false` | Удаление старых версий Python |
| `python_log_level` | `"INFO"` | Уровень логирования |
### Переменные для разных ОС
Роль автоматически определяет переменные на основе `ansible_os_family` и `ansible_distribution`:
- `python_current_packages` - пакеты Python для текущей ОС
- `python_current_build_deps` - системные зависимости для компиляции
- `python_current_package_manager` - менеджер пакетов
- `python_current_executable` - путь к исполняемому файлу Python
- `python_current_pip` - путь к pip
## Примеры использования
### Базовое использование
```yaml
- hosts: all
roles:
- python
```
### С дополнительными пакетами
```yaml
- hosts: all
vars:
python_pip_packages:
- requests
- flask
- django
python_create_venv: true
python_venv_path: "/opt/myapp-venv"
roles:
- python
```
### С компиляцией из исходного кода
```yaml
- hosts: all
vars:
python_install_prefix: "/opt/python3.11"
python_create_symlinks: true
roles:
- python
```
### Для конкретной версии Python
```yaml
- hosts: all
vars:
python_version: "3.12.0"
roles:
- python
```
## Поддерживаемые дистрибутивы
### Debian/Ubuntu
Роль использует репозиторий `deadsnakes` для установки Python 3.12:
```yaml
- hosts: ubuntu_servers
roles:
- python
```
### RHEL/CentOS/Rocky/AlmaLinux
Роль использует EPEL репозиторий для установки Python 3.12:
```yaml
- hosts: rhel_servers
roles:
- python
```
### Fedora
```yaml
- hosts: fedora_servers
roles:
- python
```
### openSUSE
```yaml
- hosts: suse_servers
roles:
- python
```
## Альтернативные репозитории
Для старых дистрибутивов, которые не поддерживают Python 3.12 из стандартных репозиториев, роль автоматически использует альтернативные источники:
### RHEL/CentOS 7
- **IUS Repository**: Предоставляет современные версии Python
- **SCL (Software Collections)**: Для очень старых систем
- **EPEL**: Дополнительные пакеты
### Debian/Ubuntu старых версий
- **deadsnakes PPA**: Предоставляет Python 3.12 для старых версий
- **Альтернативные пакеты**: Python 3.11 если 3.12 недоступен
### Автоматическое переключение
Роль автоматически пытается установить Python 3.12, а если это невозможно, переключается на доступную версию (3.11) или использует альтернативные репозитории.
## Структура роли
```
roles/python/
├── defaults/
│ └── main.yml # Переменные по умолчанию
├── handlers/
│ └── main.yml # Обработчики событий
├── meta/
│ └── main.yml # Метаданные роли
├── tasks/
│ └── main.yml # Основные задачи
├── vars/
│ └── main.yml # Переменные для разных ОС
└── README.md # Документация
```
## Логирование
Роль поддерживает подробное логирование. Установите `python_log_level: "DEBUG"` для получения детальной информации о процессе установки.
## Обработка ошибок
Роль включает проверки на каждом этапе:
1. Проверка наличия Python перед установкой
2. Проверка успешности установки
3. Проверка работоспособности pip
4. Очистка временных файлов
## Производительность
- Использует параллельную компиляцию (количество ядер CPU)
- Оптимизированная конфигурация Python с LTO
- Кэширование пакетов
- Очистка временных файлов
## Безопасность
- Проверка целостности загружаемых файлов
- Использование официальных репозиториев
- Минимальные привилегии для установки
## Устранение неполадок
### Python не найден после установки
```bash
# Проверьте символические ссылки
ls -la /usr/bin/python3*
# Обновите библиотеки
sudo ldconfig
```
### Ошибки компиляции
```bash
# Установите системные зависимости
sudo apt install build-essential # Ubuntu/Debian
sudo dnf groupinstall "Development Tools" # RHEL/CentOS
```
### Проблемы с pip
```bash
# Обновите pip
python3 -m pip install --upgrade pip
# Проверьте версию
pip3 --version
```
## Лицензия
MIT
## Автор
**Сергей Антропов**
Сайт: https://devops.org.ru
## Поддержка
Для получения поддержки или сообщения об ошибках, пожалуйста, создайте issue в репозитории проекта.

View File

@@ -0,0 +1,60 @@
---
# Переменные по умолчанию для роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Версия Python для установки
python_version: "3.12"
# Установка дополнительных пакетов Python
python_packages:
- pip
- setuptools
- wheel
- virtualenv
# Установка системных зависимостей для компиляции Python
python_build_dependencies:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- tk-devel
- gdbm-devel
- db4-devel
- libpcap-devel
- xz-devel
- expat-devel
- bzip2-devel
- ncurses-devel
- libuuid-devel
- libnsl2-devel
# Путь для установки Python
python_install_prefix: "/usr/local"
# Создание символических ссылок
python_create_symlinks: true
# Обновление pip после установки
python_update_pip: true
# Установка дополнительных pip пакетов
python_pip_packages: []
# Создание виртуального окружения
python_create_venv: false
python_venv_path: "/opt/python-venv"
# Настройка альтернатив (для систем с alternatives)
python_setup_alternatives: true
# Удаление старых версий Python (осторожно!)
python_remove_old_versions: false
# Логирование
python_log_level: "INFO"

View File

@@ -0,0 +1,66 @@
---
# Пример использования роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Установка Python 3.12 на все хосты"
hosts: all
become: yes
gather_facts: yes
vars:
# Основные настройки
python_version: "3.12"
python_log_level: "INFO"
# Дополнительные пакеты
python_pip_packages:
- requests
- flask
- django
- pytest
# Создание виртуального окружения
python_create_venv: true
python_venv_path: "/opt/python-venv"
# Настройки символических ссылок
python_create_symlinks: true
python_setup_alternatives: true
# Обновление pip до последней версии
python_update_pip: true
roles:
- python
post_tasks:
- name: "Проверка установки Python"
command: "python3 --version"
register: python_version_result
changed_when: false
- name: "Проверка установки pip"
command: "pip3 --version"
register: pip_version_result
changed_when: false
- name: "Проверка виртуального окружения"
stat:
path: "{{ python_venv_path }}"
register: venv_check
- name: "📋 КРАТКИЙ ОТЧЕТ О УСТАНОВКЕ"
debug:
msg: |
🎉 УСТАНОВКА ЗАВЕРШЕНА УСПЕШНО!
📊 Результаты:
• Python: {{ python_version_result.stdout }}
• Pip: {{ pip_version_result.stdout }}
• Виртуальное окружение: {{ 'создано' if venv_check.stat.exists else 'не создано' }}
• Путь к Python: {{ python_current_executable | default('не определен') }}
• Путь к pip: {{ python_current_pip | default('не определен') }}
🚀 Python {{ python_version }} готов к использованию!

View File

@@ -0,0 +1,44 @@
---
# Обработчики для роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Перезапуск systemd для обновления библиотек"
systemd:
daemon_reload: yes
when: ansible_service_mgr == "systemd"
- name: "Обновление кэша библиотек"
command: "ldconfig"
changed_when: false
when: ansible_os_family == "RedHat"
- name: "Обновление кэша пакетов"
apt:
update_cache: yes
when: ansible_os_family == "Debian"
- name: "Очистка кэша пакетов"
command: "{{ item }}"
loop:
- "dnf clean all"
- "yum clean all"
changed_when: false
when: ansible_os_family == "RedHat"
ignore_errors: true
- name: "Уведомление о завершении установки Python"
debug:
msg: |
✅ PYTHON {{ python_version | upper }} УСТАНОВЛЕН И НАСТРОЕН!
🎯 Основные команды:
• python --version # Проверить версию Python
• python3 --version # Проверить версию Python (с версией)
• pip --version # Проверить версию pip
• pip3 --version # Проверить версию pip (с версией)
• python -m venv env # Создать виртуальное окружение
• pip install pkg # Установить пакет
🚀 Готово к работе!

View File

@@ -0,0 +1,54 @@
---
# Метаданные роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
galaxy_info:
author: "Сергей Антропов"
description: "Универсальная роль для установки Python 3.12 на различных дистрибутивах Linux"
company: "DevOps Lab"
license: "MIT"
min_ansible_version: "2.9"
platforms:
- name: "Ubuntu"
versions:
- "focal"
- "jammy"
- "noble"
- name: "Debian"
versions:
- "buster"
- "bullseye"
- "bookworm"
- name: "EL"
versions:
- "7"
- "8"
- "9"
- name: "Rocky"
versions:
- "8.8"
- "9.0"
- name: "Fedora"
versions:
- "35"
- "36"
- "37"
- "38"
- "39"
- "40"
- name: "opensuse"
versions:
- "15.3"
- "15.4"
- "15.5"
galaxy_tags:
- "python"
- "programming"
- "development"
- "runtime"
- "language"
- "universal"
- "crossplatform"
dependencies: []

544
roles/python/tasks/main.yml Normal file
View File

@@ -0,0 +1,544 @@
---
# Основные задачи для установки Python 3.12
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Отладочная информация о системе"
debug:
msg:
- "ansible_distribution: '{{ ansible_distribution }}'"
- "ansible_os_family: '{{ ansible_os_family }}'"
- "ansible_distribution_version: '{{ ansible_distribution_version }}'"
when: (python_log_level | default("INFO")) in ["DEBUG", "INFO"]
- name: "Определение переменных для текущей ОС"
set_fact:
python_distribution: "{{ ansible_distribution | lower }}"
python_os_family: "{{ ansible_os_family | lower }}"
python_current_package_manager: "{{ python_package_managers[ansible_distribution | lower] | default('unknown') }}"
python_current_packages: "{{ python_packages_by_os[ansible_distribution | lower] | default([]) }}"
python_current_build_deps: "{{ python_build_deps_by_os[ansible_distribution | lower] | default([]) }}"
python_current_executable: "{{ python_executable_paths[ansible_distribution | lower] | default('/usr/bin/python3.12') }}"
python_current_pip: "{{ python_pip_paths[ansible_distribution | lower] | default('/usr/bin/pip3.12') }}"
- name: "Проверка определенных переменных"
debug:
msg:
- "python_distribution: '{{ python_distribution }}'"
- "python_os_family: '{{ python_os_family }}'"
- "python_current_package_manager: '{{ python_current_package_manager }}'"
- "python_current_packages: {{ python_current_packages }}"
- "python_current_build_deps: {{ python_current_build_deps }}"
- "python_current_executable: '{{ python_current_executable }}'"
- "python_current_pip: '{{ python_current_pip }}'"
when: (python_log_level | default("INFO")) in ["DEBUG", "INFO"]
# =============================================================================
# ЭТАП 1: ДОБАВЛЕНИЕ РЕПОЗИТОРИЕВ
# =============================================================================
- name: "Добавление репозиториев для Ubuntu/Debian"
apt_repository:
repo: "{{ item.url }}"
state: "{{ item.state }}"
update_cache: yes
loop: "{{ python_repositories[python_distribution] | default([]) }}"
when:
- python_distribution in ['ubuntu', 'debian']
- python_repositories[python_distribution] is defined
ignore_errors: true
- name: "Добавление репозиториев для RHEL-семейства"
package:
name: "{{ item.name }}"
state: "{{ item.state }}"
loop: "{{ python_repositories[python_distribution] | default([]) }}"
when:
- python_distribution in ['redhat', 'centos', 'rhel', 'rocky', 'alma', 'fedora']
- python_repositories[python_distribution] is defined
- item.name != 'scl'
ignore_errors: true
- name: "Добавление SCL репозиториев для старых RHEL/CentOS"
yum_repository:
name: "{{ item.name }}"
description: "{{ item.name }} repository"
baseurl: "{{ item.url }}"
gpgcheck: no
enabled: yes
loop: "{{ python_repositories[python_distribution] | default([]) }}"
when:
- python_distribution in ['redhat', 'centos', 'rhel']
- python_repositories[python_distribution] is defined
- item.name == 'scl'
ignore_errors: true
# =============================================================================
# ЭТАП 2: ОБНОВЛЕНИЕ ПАКЕТОВ
# =============================================================================
- name: "Обновление списка пакетов"
package:
name: "*"
state: present
when:
- python_current_package_manager in ['apt', 'dnf', 'zypper']
- python_current_package_manager != 'unknown'
- name: "Обновление списка пакетов после добавления репозиториев"
package:
name: "*"
state: present
when:
- python_repositories[python_distribution] is defined
- python_current_package_manager in ['apt', 'dnf']
# =============================================================================
# ЭТАП 3: УСТАНОВКА СИСТЕМНЫХ ЗАВИСИМОСТЕЙ
# =============================================================================
- name: "Установка системных зависимостей для компиляции"
package:
name: "{{ python_current_build_deps }}"
state: present
when:
- python_current_build_deps | length > 0
- python_current_package_manager != 'unknown'
ignore_errors: true
# =============================================================================
# ЭТАП 4: ПРОВЕРКА И УСТАНОВКА PYTHON СТАНДАРТНЫМ СПОСОБОМ
# =============================================================================
- name: "Проверка наличия Python {{ python_version }}"
command: "{{ python_current_executable }} --version"
register: python_version_check
failed_when: false
changed_when: false
when: python_current_executable is defined and python_current_executable != ""
- name: "Установка Python из пакетов (основной способ)"
package:
name: "{{ python_current_packages }}"
state: present
when:
- python_current_packages | length > 0
- python_current_package_manager != 'unknown'
- python_version_check.rc != 0
register: python_package_install
ignore_errors: true
# =============================================================================
# ЭТАП 5: FALLBACK НА АЛЬТЕРНАТИВНЫЕ СПОСОБЫ
# =============================================================================
- name: "Попытка установки альтернативных пакетов Python"
package:
name: "{{ python_current_packages | select('match', '.*python3\\.1[12].*') | list }}"
state: present
when:
- python_package_install is defined
- python_package_install.failed | default(false)
- python_current_package_manager != 'unknown'
- python_version_check.rc != 0
register: python_alt_install
ignore_errors: true
- name: "Попытка установки SCL пакетов Python"
package:
name: "{{ python_current_packages | select('match', '.*rh-python.*') | list }}"
state: present
when:
- python_alt_install is defined
- python_alt_install.failed | default(false)
- python_current_package_manager != 'unknown'
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
register: python_scl_install
ignore_errors: true
# =============================================================================
# ЭТАП 6: КОМПИЛЯЦИЯ ИЗ ИСХОДНИКОВ (ПОСЛЕДНИЙ СПОСОБ)
# =============================================================================
- name: "Скачивание исходного кода Python {{ python_version }}"
get_url:
url: "https://www.python.org/ftp/python/{{ python_version }}/Python-{{ python_version }}.tar.xz"
dest: "/tmp/Python-{{ python_version }}.tar.xz"
mode: '0644'
register: download_result
failed_when: false
changed_when: false
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- python_package_install is defined
- python_package_install.failed | default(false)
- python_alt_install is defined
- python_alt_install.failed | default(false)
ignore_errors: true
- name: "Распаковка исходного кода Python"
unarchive:
src: "/tmp/Python-{{ python_version }}.tar.xz"
dest: "/tmp/"
remote_src: yes
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
- name: "Конфигурация Python для компиляции"
command: >
./configure
--prefix={{ python_install_prefix | default('/usr/local') }}
--enable-optimizations
--enable-shared
--with-lto
--enable-ipv6
--with-system-ffi
--with-computed-gotos
--enable-loadable-sqlite-extensions
args:
chdir: "/tmp/Python-{{ python_version }}"
changed_when: false
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
- name: "Компиляция Python"
make:
chdir: "/tmp/Python-{{ python_version }}"
jobs: "{{ ansible_processor_cores | default(1) }}"
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
- name: "Установка скомпилированного Python"
make:
chdir: "/tmp/Python-{{ python_version }}"
target: install
become: true
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
- name: "Обновление библиотек для скомпилированного Python"
command: "ldconfig"
become: true
changed_when: false
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
# =============================================================================
# ЭТАП 7: СОЗДАНИЕ СИМВОЛИЧЕСКИХ ССЫЛОК
# =============================================================================
- name: "Создание символических ссылок для Python"
file:
src: "{{ python_current_executable }}"
dest: "/usr/bin/python3"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- name: "Создание символических ссылок для SCL Python"
file:
src: "/opt/rh/rh-python312/root/usr/bin/python3"
dest: "/usr/bin/python3"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
- python_scl_install is defined
- python_scl_install.changed | default(false)
- name: "Создание символических ссылок для pip"
file:
src: "{{ python_current_pip }}"
dest: "/usr/bin/pip3"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_current_pip is defined
- python_current_pip != ""
- name: "Создание символических ссылок для SCL pip"
file:
src: "/opt/rh/rh-python312/root/usr/bin/pip3"
dest: "/usr/bin/pip3"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
- python_scl_install is defined
- python_scl_install.changed | default(false)
- name: "Создание символических ссылок для Python (без версии)"
file:
src: "{{ python_current_executable }}"
dest: "/usr/bin/python"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- name: "Создание символических ссылок для SCL Python (без версии)"
file:
src: "/opt/rh/rh-python312/root/usr/bin/python"
dest: "/usr/bin/python"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
- python_scl_install is defined
- python_scl_install.changed | default(false)
- name: "Создание символических ссылок для pip (без версии)"
file:
src: "{{ python_current_pip }}"
dest: "/usr/bin/pip"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_current_pip is defined
- python_current_pip != ""
- name: "Создание символических ссылок для SCL pip (без версии)"
file:
src: "/opt/rh/rh-python312/root/usr/bin/pip"
dest: "/usr/bin/pip"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
- python_scl_install is defined
- python_scl_install.changed | default(false)
# =============================================================================
# ЭТАП 8: НАСТРОЙКА АЛЬТЕРНАТИВ И PIP
# =============================================================================
- name: "Настройка альтернатив для Python"
alternatives:
name: python3
path: "{{ python_current_executable }}"
when:
- python_current_executable is defined
- python_current_executable != ""
- ansible_os_family == "RedHat"
- name: "Установка pip через get-pip.py если не найден"
get_url:
url: "https://bootstrap.pypa.io/get-pip.py"
dest: "/tmp/get-pip.py"
mode: '0755'
when:
- python_version_check.rc == 0
- python_current_pip is not defined or python_current_pip == ""
- name: "Запуск get-pip.py для установки pip"
command: "{{ python_current_executable }} /tmp/get-pip.py"
changed_when: false
when:
- python_version_check.rc == 0
- python_current_pip is not defined or python_current_pip == ""
# =============================================================================
# ЭТАП 9: ОБНОВЛЕНИЕ PIP
# =============================================================================
- name: "Получение последней версии pip"
uri:
url: "https://pypi.org/pypi/pip/json"
method: GET
register: pip_version_info
when: python_version_check.rc == 0
ignore_errors: true
- name: "Извлечение версии pip"
set_fact:
pip_latest_version: "{{ pip_version_info.json.info.version }}"
when:
- pip_version_info is defined
- pip_version_info.status == 200
- name: "Проверка текущей версии pip"
command: "{{ python_current_pip }} --version"
register: pip_current_version
changed_when: false
when:
- python_version_check.rc == 0
- python_current_pip is defined
- python_current_pip != ""
ignore_errors: true
- name: "Обновление pip до последней версии"
command: "{{ python_current_pip }} install --upgrade pip"
changed_when: false
when:
- python_version_check.rc == 0
- pip_current_version.rc == 0
- pip_latest_version is defined
- pip_current_version.stdout is defined
- pip_latest_version not in pip_current_version.stdout
ignore_errors: true
# =============================================================================
# ЭТАП 10: СОЗДАНИЕ ВИРТУАЛЬНОГО ОКРУЖЕНИЯ
# =============================================================================
- name: "Создание виртуального окружения"
command: "{{ python_current_executable }} -m venv {{ python_venv_path | default('/opt/python-venv') }}"
changed_when: false
when:
- (python_create_venv | default(false)) | bool
- python_version_check.rc == 0
ignore_errors: true
# =============================================================================
# ЭТАП 11: ФИНАЛЬНЫЙ ОТЧЕТ
# =============================================================================
- name: "Сбор информации о системе"
setup:
gather_subset:
- "!all"
- "distribution"
- "os_family"
- "architecture"
- "kernel"
- "python"
register: system_facts
- name: "Проверка установленного Python"
command: "{{ python_current_executable }} --version"
register: final_python_version
changed_when: false
when: python_version_check.rc == 0
ignore_errors: true
- name: "Проверка установленного pip"
command: "{{ python_current_pip }} --version"
register: final_pip_version
changed_when: false
when:
- python_version_check.rc == 0
- python_current_pip is defined
- python_current_pip != ""
ignore_errors: true
- name: "Проверка символических ссылок"
stat:
path: "{{ item }}"
register: symlink_check
loop:
- "/usr/bin/python"
- "/usr/bin/python3"
- "/usr/bin/pip"
- "/usr/bin/pip3"
- name: "Проверка виртуального окружения"
stat:
path: "{{ python_venv_path | default('/opt/python-venv') }}"
register: venv_check
when: python_create_venv | bool
- name: "Сбор информации об установленных пакетах Python"
package_facts:
manager: "{{ python_current_package_manager }}"
when: python_current_package_manager != 'unknown'
- name: "Финальный отчет об установке"
debug:
msg: |
================================================================================
🐍 ОТЧЕТ ОБ УСТАНОВКЕ PYTHON {{ python_version | upper }}
================================================================================
📊 ИНФОРМАЦИЯ О СИСТЕМЕ:
• Дистрибутив: {{ system_facts.ansible_facts.distribution }} {{ system_facts.ansible_facts.distribution_version }}
• Семейство ОС: {{ system_facts.ansible_facts.os_family }}
• Архитектура: {{ system_facts.ansible_facts.architecture }}
• Ядро: {{ system_facts.ansible_facts.kernel }}
🐍 PYTHON:
• Версия: {{ final_python_version.stdout | default('НЕ УСТАНОВЛЕН') }}
• Исполняемый файл: {{ python_current_executable }}
• Путь к pip: {{ python_current_pip | default('НЕ НАЙДЕН') }}
📦 PIP:
• Версия: {{ final_pip_version.stdout | default('НЕ УСТАНОВЛЕН') }}
🔗 СИМВОЛИЧЕСКИЕ ССЫЛКИ:
• /usr/bin/python: {{ '✅ СОЗДАНА' if symlink_check.results[0].stat.exists else '❌ НЕ СОЗДАНА' }}
• /usr/bin/python3: {{ '✅ СОЗДАНА' if symlink_check.results[1].stat.exists else '❌ НЕ СОЗДАНА' }}
• /usr/bin/pip: {{ '✅ СОЗДАНА' if symlink_check.results[2].stat.exists else '❌ НЕ СОЗДАНА' }}
• /usr/bin/pip3: {{ '✅ СОЗДАНА' if symlink_check.results[3].stat.exists else '❌ НЕ СОЗДАНА' }}
🌐 ВИРТУАЛЬНОЕ ОКРУЖЕНИЕ:
• Путь: {{ python_venv_path | default('/opt/python-venv') }}
• Статус: {{ '✅ СОЗДАНО' if (venv_check is defined and venv_check.stat.exists) else '❌ НЕ СОЗДАНО' }}
📋 УСТАНОВЛЕННЫЕ ПАКЕТЫ PYTHON:
{% if ansible_facts.packages is defined %}
{% for package in ansible_facts.packages %}
{% if 'python' in package %}
• {{ package }}: {{ ansible_facts.packages[package] | map(attribute='version') | list | join(', ') }}
{% endif %}
{% endfor %}
{% else %}
• Информация недоступна
{% endif %}
🎯 КОМАНДЫ ДЛЯ ПРОВЕРКИ:
• python --version
• python3 --version
• pip --version
• pip3 --version
• python -m venv test_env
================================================================================
when: python_log_level in ["INFO", "DEBUG"]
- name: "Уведомление о завершении установки Python"
debug:
msg: |
✅ PYTHON {{ python_version | upper }} УСТАНОВЛЕН И НАСТРОЕН!
🎯 Основные команды:
• python --version # Проверить версию Python
• python3 --version # Проверить версию Python (с версией)
• pip --version # Проверить версию pip
• pip3 --version # Проверить версию pip (с версией)
• python -m venv env # Создать виртуальное окружение
• pip install pkg # Установить пакет
🚀 Готово к работе!

474
roles/python/vars/main.yml Normal file
View File

@@ -0,0 +1,474 @@
---
# Переменные для роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Определение семейства ОС и версии
python_os_family: "{{ ansible_os_family | lower }}"
python_distribution: "{{ ansible_distribution | lower }}"
python_distribution_version: "{{ ansible_distribution_version }}"
# Переменные для разных дистрибутивов
python_package_managers:
debian: "apt"
ubuntu: "apt"
redhat: "dnf"
centos: "dnf"
rhel: "dnf"
rocky: "dnf"
alma: "dnf"
fedora: "dnf"
suse: "zypper"
opensuse: "zypper"
alt: "apt-rpm"
"alt linux": "apt-rpm"
astra: "apt"
"astra linux": "apt"
# Пакеты для установки Python 3.12 в разных дистрибутивах
python_packages_by_os:
debian:
- python3.12
- python3.12-dev
- python3.12-venv
- python3.12-distutils
- python3.12-lib2to3
- python3.12-gdbm
- python3.12-tk
# Альтернативные пакеты для старых Debian
- python3.11
- python3.11-dev
- python3.11-venv
ubuntu:
- python3.12
- python3.12-dev
- python3.12-venv
- python3.12-distutils
- python3.12-lib2to3
- python3.12-gdbm
- python3.12-tk
# Альтернативные пакеты для старых Ubuntu
- python3.11
- python3.11-dev
- python3.11-venv
# Пакеты без версии для совместимости
- python3-distutils
- python3-lib2to3
redhat:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
centos:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
# Альтернативные пакеты для старых CentOS
- python312
- python312-pip
- python312-devel
# SCL пакеты для очень старых CentOS
- rh-python312
- rh-python312-python-pip
- rh-python312-python-devel
rhel:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
# Альтернативные пакеты для старых RHEL
- python312
- python312-pip
- python312-devel
# SCL пакеты для очень старых RHEL
- rh-python312
- rh-python312-python-pip
- rh-python312-python-devel
rocky:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
alma:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
fedora:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
suse:
- python312
- python312-devel
- python312-pip
opensuse:
- python312
- python312-devel
- python312-pip
alt:
- python3.12
- python3.12-devel
- python3.12-pip
astra:
- python3.12
- python3.12-dev
- python3.12-venv
- python3.12-distutils
- python3.12-lib2to3
- python3.12-gdbm
- python3.12-tk
"alt linux":
- python3.12
- python3.12-devel
- python3.12-pip
"astra linux":
- python3.12
- python3.12-dev
- python3.12-venv
- python3.12-distutils
- python3.12-lib2to3
- python3.12-gdbm
- python3.12-tk
# Репозитории для разных дистрибутивов
python_repositories:
debian:
- name: "deadsnakes"
url: "ppa:deadsnakes/ppa"
state: "present"
- name: "deadsnakes-debian"
url: "deb http://ppa.launchpad.net/deadsnakes/ppa/ubuntu focal main"
state: "present"
ubuntu:
- name: "deadsnakes"
url: "ppa:deadsnakes/ppa"
state: "present"
redhat:
- name: "epel"
state: "present"
- name: "ius"
url: "https://repo.ius.io/redhat/7/x86_64/"
state: "present"
centos:
- name: "epel"
state: "present"
- name: "ius"
url: "https://repo.ius.io/centos/7/x86_64/"
state: "present"
- name: "scl"
url: "https://www.softwarecollections.org/en/scls/rhscl/rh-python312/"
state: "present"
rhel:
- name: "epel"
state: "present"
- name: "ius"
url: "https://repo.ius.io/redhat/7/x86_64/"
state: "present"
- name: "scl"
url: "https://www.softwarecollections.org/en/scls/rhscl/rh-python312/"
state: "present"
rocky:
- name: "epel"
state: "present"
alma:
- name: "epel"
state: "present"
fedora:
- name: "epel"
state: "present"
# Команды для обновления пакетов
python_update_commands:
debian: "apt update"
ubuntu: "apt update"
redhat: "dnf update -y"
centos: "dnf update -y"
rhel: "dnf update -y"
rocky: "dnf update -y"
alma: "dnf update -y"
fedora: "dnf update -y"
suse: "zypper refresh"
opensuse: "zypper refresh"
alt: "apt-get update"
"alt linux": "apt-get update"
astra: "apt update"
"astra linux": "apt update"
# Команды для установки пакетов
python_install_commands:
debian: "apt install -y"
ubuntu: "apt install -y"
redhat: "dnf install -y"
centos: "dnf install -y"
rhel: "dnf install -y"
rocky: "dnf install -y"
alma: "dnf install -y"
fedora: "dnf install -y"
suse: "zypper install -y"
opensuse: "zypper install -y"
alt: "apt-get install -y"
"alt linux": "apt-get install -y"
astra: "apt install -y"
"astra linux": "apt install -y"
# Пути к исполняемым файлам Python
python_executable_paths:
debian: "/usr/bin/python3.12"
ubuntu: "/usr/bin/python3.12"
redhat: "/usr/bin/python3.12"
centos: "/usr/bin/python3.12"
rhel: "/usr/bin/python3.12"
rocky: "/usr/bin/python3.12"
alma: "/usr/bin/python3.12"
fedora: "/usr/bin/python3.12"
suse: "/usr/bin/python3.12"
opensuse: "/usr/bin/python3.12"
alt: "/usr/bin/python3.12"
"alt linux": "/usr/bin/python3.12"
astra: "/usr/bin/python3.12"
"astra linux": "/usr/bin/python3.12"
# Пути к pip
python_pip_paths:
debian: "/usr/bin/pip3.12"
ubuntu: "/usr/bin/pip3.12"
redhat: "/usr/bin/pip3.12"
centos: "/usr/bin/pip3.12"
rhel: "/usr/bin/pip3.12"
rocky: "/usr/bin/pip3.12"
alma: "/usr/bin/pip3.12"
fedora: "/usr/bin/pip3.12"
suse: "/usr/bin/pip3.12"
opensuse: "/usr/bin/pip3.12"
alt: "/usr/bin/pip3.12"
"alt linux": "/usr/bin/pip3.12"
astra: "/usr/bin/pip3.12"
"astra linux": "/usr/bin/pip3.12"
# Системные зависимости для компиляции
python_build_deps_by_os:
debian:
- build-essential
- zlib1g-dev
- libssl-dev
- libffi-dev
- libsqlite3-dev
- libreadline-dev
- libbz2-dev
- libncurses5-dev
- libncursesw5-dev
- xz-utils
- tk-dev
- libgdbm-dev
- libdb-dev
- libpcap-dev
- liblzma-dev
ubuntu:
- build-essential
- zlib1g-dev
- libssl-dev
- libffi-dev
- libsqlite3-dev
- libreadline-dev
- libbz2-dev
- libncurses5-dev
- libncursesw5-dev
- xz-utils
- tk-dev
- libgdbm-dev
- libdb-dev
- libpcap-dev
- liblzma-dev
redhat:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- db4-devel
- libpcap-devel
- expat-devel
- libnsl2-devel
centos:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
# Альтернативные пакеты для CentOS
- gdbm
- db4
rhel:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
rocky:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
alma:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
fedora:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
suse:
- gcc
- gcc-c++
- make
- zlib-devel
- libopenssl-devel
- libffi-devel
- sqlite3-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- libpcap-devel
- expat-devel
- libnsl2-devel
opensuse:
- gcc
- gcc-c++
- make
- zlib-devel
- libopenssl-devel
- libffi-devel
- sqlite3-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
alt:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
astra:
- build-essential
- zlib1g-dev
- libssl-dev
- libffi-dev
- libsqlite3-dev
- libreadline-dev
- libbz2-dev
- libncurses5-dev
- libncursesw5-dev
- xz-utils
- tk-dev
- libgdbm-dev
- libdb-dev
- libpcap-dev
- liblzma-dev
"alt linux":
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
"astra linux":
- build-essential
- zlib1g-dev
- libssl-dev
- libffi-dev
- libsqlite3-dev
- libreadline-dev
- libbz2-dev
- libncurses5-dev
- libncursesw5-dev
- xz-utils
- tk-dev
- libgdbm-dev
- libdb-dev
- libpcap-dev
- liblzma-devel