Как можно исправить сбой выполнения длительной задачи (более двух часов) в Ansible, который приводит к ошибке UNREACHABLE из-за, скорее всего, таймаута?

Как можно увеличить время активного соединения для выполнения длительной шелл команды на удаленном хосте с помощью Ansible в Jenkins? Попытки изменить параметры persistent_connection в Ansible конфиге не привели к успеху, и появляется ошибка UNREACHABLE через 2 часа после запуска таски. Какие варианты есть для увеличения времени активного соединения для одной и той же таски/плея в Ansible, или существует ли легковесный альтернативный инструмент, способный надежно удерживать соединение при запуске шелл команды на удаленном хосте через Jenkins pipeline?
  • 2 февраля 2024 г. 18:59
Ответы на вопрос 2
Сначала рассмотрим несколько подходов, которые могут помочь избежать проблемы таймаута в Ansible:

1. **Async и Poll**
   Ansible позволяет выполнять задачи асинхронно, что означает, что вы можете запустить задачу и регулярно проверять её статус с использованием параметров `async` и `poll`:
   
   ```yaml
   - name: Пример асинхронной задачи
     command: /path/to/long/running/script.sh
     async: 7200 # Максимальное время ожидания в секундах
     poll: 60 # Интервал проверки статуса в секундах
   ```
   
   Эта опция подходит для заданий, которые могут выполняться без постоянного подключения к управляющему хосту.

2. **Изменение конфигурации SSH**
   Увеличьте значения таймаутов в файле `ansible.cfg` и/или в файле конфигурации SSH на управляющем хосте:

   Пример для `ansible.cfg`:
   ```ini
   [ssh_connection]
   ssh_args = -o ControlMaster=auto -o ControlPersist=3600s -o ServerAliveInterval=60
   timeout = 30
   ```
   
   В файле конфигурации SSH (`/etc/ssh/ssh_config` или `~/.ssh/config`):
   
   ```
   Host *
       ServerAliveInterval 60
       ServerAliveCountMax 60
   ```

   Подобные настройки поддерживают SSH соединение активным, отправляя "keep-alive" пакеты в интервалах, определенных `ServerAliveInterval`.

3. **Работа с прокси-скриптом/командой**
   Можно создать прокси-скрипт, который запускает длительную команду в фоне на целевом хосте, перехватывая стандартный вывод и возвращая управление немедленно. Данный подход может потребовать отдельной логики для проверки состояния процесса.

4. **Использование screen/tmux**
   Запуск скрипта в утилите `screen` или `tmux` на удаленном хосте позволяет процессу продолжать работать даже после разрыва связи. Позднее можно подключиться к сессии и проверить результат выполнения команды.

Рассмотрим также возможные альтернативные инструменты:

1. **Rundeck**
   Rundeck – это серверная система автоматизации, которая позволяет запускать задачи на разных удаленных устройствах, поддерживая при этом более длительные операции.

2. **Jenkins с использованием SSH сессии**
   Вы можете напрямую используем SSH в Jenkins Pipeline, запуская скрипты в фоне и периодически проверяя их статус:

   ```groovy
   sh "ssh user@remotehost 'nohup /path/to/long/running/script.sh &'"
   ```

3. **Использование Fabric или Invoke**
   Это библиотеки Python, позволяющие запускать команды на удаленных хостах через SSH, и которые можно настроить на работу с длительными задачами.

Важно помнить, что любое решение должно быть надежно и безопасно, особенно если задача, которую вы выполняете, имеет критическое значение. Обязательно увеличьте уровень логирования Ansible для лучшего диагностирования проблем (`-vvv
надо увеличить основной параметр в конфиге который называется просто  timeout 
ну и все остальные тоже увеличить до 2 часов
в ссх конфиге поправить ControlPersist и ControlMaster
ну и запустить с -vvv если падает на одном месте то сразу увидите почему
Похожие вопросы