Конфигурационные ошибки в Linux‑системах – одна из главных причин сбоев и уязвимостей. Их обнаружение часто требует ручного анализа, что отнимает время и повышает риск человеческой ошибки. В этой статье мы покажем, как собрать компактный инструмент, работающий полностью в Termux на Android‑устройстве, использующий Ansible для декларативного описания желаемого состояния и Bash‑скрипты для автоматического исправления найденных отклонений.
Почему именно Termux?
Termux предоставляет полноценный Linux‑окружение на Android без необходимости root‑доступа. Это делает его идеальной площадкой для:
- Портативных аудитов серверов (по SSH).
- Запуска локального CI/CD‑pipeline прямо на смартфоне.
- Быстрого прототипирования без установки виртуальных машин.
Все необходимые пакеты (python, ansible, sshpass и др.) доступны через pkg‑менеджер.
Архитектура решения
Схема взаимодействия выглядит так:
+-------------------+ SSH +-------------------+
| Termux (Android) | ----------> | Remote Linux |
|-------------------| | (target host) |
| Bash‑wrapper | +-------------------+
| └─> Ansible playbook (checks) |
| └─> Bash‑fixer (apply fixes) |
+-------------------+
Базовый процесс:
- Базовый Bash‑скрипт (
run_check.sh) инициирует подключение к удалённому хосту. - Запускается Ansible‑плейбук
detect.yml, который собирает информацию о конфигурации (systemd‑службы, файлы/etc, параметры ядра и т.д.). - Результаты сохраняются в JSON‑файл
report.json. - Если найдены отклонения, Bash‑скрипт вызывает второй Ansible‑плейбук
fix.ymlили локальные Bash‑модули для исправления.
Подготовка окружения в Termux
# Обновляем репозитории
pkg update -y && pkg upgrade -y
# Устанавливаем необходимые пакеты
pkg install -y python git openssh sshpass
# Устанавливаем Ansible через pip
pip install --user ansible
# Добавляем ~/.local/bin в PATH (для текущей сессии)
export PATH=$HOME/.local/bin:$PATH
# Проверяем версии
python --version
ansible --version
Создание Ansible‑плейбука для обнаружения ошибок
Файл detect.yml описывает набор «facts», которые нам нужны для анализа.
---
- name: Сбор данных о конфигурации
hosts: all
gather_facts: false
vars:
report_path: /tmp/report.json
tasks:
- name: Получить статус systemd‑служб
command: systemctl is-enabled {{ item }}
register: svc_status
loop:
- sshd
- firewalld
- nginx
ignore_errors: true
- name: Считать текущие параметры ядра
sysctl:
name: net.ipv4.ip_forward
register: ip_forward
- name: Сохранить результаты в JSON
copy:
dest: "{{ report_path }}"
content: |
{
"services": {{ svc_status.results | map(attribute='stdout') | list }},
"ip_forward": {{ ip_forward.stdout }}
}
- name: Передать отчет локально
fetch:
src: "{{ report_path }}"
dest: "./reports/{{ inventory_hostname }}_report.json"
flat: yes
Bash‑обёртка: автоматизация процесса
#!/usr/bin/env bash
set -euo pipefail
# Параметры подключения
HOST=${1:?Укажите IP/hostname целевого сервера}
USER=${2:-root}
PASS=${3:?Укажите пароль или настройте SSH‑ключ}
# Путь к Ansible‑инвентори
cat > inventory.ini <<EOF
[targets]
${HOST} ansible_user=${USER} ansible_ssh_pass=${PASS} ansible_python_interpreter=/usr/bin/python3
EOF
# Запуск обнаружения
ansible-playbook -i inventory.ini detect.yml
# Анализ отчёта
REPORT=$(cat reports/${HOST}_report.json)
echo "Отчёт получен: $REPORT"
# Пример простого условия: если ip_forward выключен – включаем
if echo "$REPORT" | grep -q '"ip_forward": "0"'; then
echo "Включаем ip_forward..."
ansible-playbook -i inventory.ini -e "ip_forward=1" fix.yml
else
echo "IP‑forward включён, действий не требуется."
fi
# Очистка временных файлов
rm -f inventory.ini
Скрипт run_check.sh можно разместить в любой директории Termux и запускать так:
chmod +x run_check.sh
./run_check.sh 192.168.1.100 root mySecretPass
Playbook для исправления (fix.yml)
---
- name: Исправление обнаруженных проблем
hosts: all
gather_facts: false
vars:
ip_forward: "{{ ip_forward | default('0') }}"
tasks:
- name: Включить ip_forward, если требуется
sysctl:
name: net.ipv4.ip_forward
value: "{{ ip_forward }}"
state: present
reload: yes
when: ip_forward == "1"
- name: Обеспечить включение sshd
service:
name: sshd
enabled: true
state: started
Тестирование и отладка
Для локального тестирования удобно использовать контейнер Docker, имитирующий удалённый хост:
# Запускаем контейнер с systemd (упрощённый вариант)
docker run -d --name test‑linux --privileged ubuntu:22.04 sleep infinity
# Устанавливаем ssh внутри контейнера
docker exec test‑linux apt update && docker exec test‑linux apt install -y openssh-server
docker exec test‑linux systemctl start ssh
# Получаем IP контейнера
HOST=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test‑linux)
# Запускаем проверку
./run_check.sh $HOST root ''
Обратите внимание, что в реальном окружении рекомендуется использовать SSH‑ключи вместо пароля.
Расширение функциональности
- Модульные проверки. Добавьте новые роли Ansible для проверки NTP, SELinux, firewall и др.
- Интеграция с CI. Запускайте
run_check.shиз GitHub Actions, перед деплоем. - Отчётность. Формируйте HTML‑/PDF‑отчёты с помощью
ansible‑reportилиjq+ шаблоны Jinja2.
Заключение
Мы построили полностью автономный инструмент, позволяющий обнаруживать и автоматически исправлять типичные конфигурационные ошибки в Linux‑системах, используя лишь смартфон с Termux. Такое решение особенно ценно для полевых инженеров, DevOps‑специалистов и системных администраторов, которым необходимо быстро проверять несколько серверов без установки тяжёлых клиентских пакетов.
RybinskLab предлагает профессиональные услуги по разработке и адаптации подобных автоматизированных решений под ваш бизнес: настройка Ansible‑инвентори, написание кастомных проверок, интеграция с системами мониторинга и CI/CD, а также обучение персонала. Свяжитесь с нами, чтобы вывести управление инфраструктурой на новый уровень.