Подтвердить что ты не робот

Как определить, почему Ansible playbook зависает во время выполнения

Некоторые из заданий, которые я написал, начинаются и никогда не заканчиваются. Ansible не предоставляет никаких ошибок или журналов, которые могли бы объяснить это, даже с опцией -vvvv. Playbook просто висит, и прохождение часов ничего не меняет.

Когда я пытаюсь выполнить свои задачи вручную (ввод команд через SSH), все в порядке.

Пример выполнения задачи:

- name: apt upgrade
  shell: apt-get upgrade

Есть ли способ увидеть stdout и stderr? Я пробовал:

- name: apt upgrade
  shell: apt-get upgrade
  register: hello
- debug: msg="{{ hello.stdout }}"
- debug: msg="{{ hello.stderr }}"

но ничего не изменилось.

У меня есть необходимые разрешения, и я передаю правильный пароль sudo - другие задачи, которые требуют правильного выполнения sudo.

4b9b3361

Ответ 1

У меня были проблемы с книгой.

Он отлично работал, пока не остановился, поэтому я добавил параметры async и poll, чтобы избежать этого.

- name: update packages full into each server
  apt: upgrade=full
  ignore_errors: True
  async: 60
  poll: 60

и он работал как шарм! Я действительно не знаю, что произошло, но теперь кажется, что Ansible принимает во внимание, что происходит и не замерзает больше!

Надеюсь, что это поможет

Ответ 2

Наиболее вероятной причиной вашей проблемы будет подключение SSH. Когда задача требует длительного времени ожидания SSH. Однажды я столкнулся с такой проблемой, чтобы преодолеть тайм-аут SSH, создав ansible.cfg в текущем каталоге, из которого вы работаете Ansible, добавьте следующее:

[ssh_connection]

ssh_args = -o ServerAliveInterval=n

Где n - ServerAliveInterval (секунды), которые мы используем при подключении к серверу через SSH. Установите его между 1-255. Это заставит ssh-клиента отправлять пустые пакеты на сервер каждые n секунды, чтобы избежать таймаута соединения.

Ответ 3

У меня были одни и те же проблемы, и после некоторого разворота я обнаружил, что проблема заключается в том, чтобы собирать факты. Вот несколько советов, которые помогут решить любую подобную проблему.

Отключить сбор фактов в вашей книге:

---
- hosts: myservers
  gather_facts: no
..

Повторите игру. Если это работает, то это означает, что виновник не находится в самом SSH, а скорее в script, собирающем факты. Мы можем легко отладить эту проблему.

  • SSH в удаленном окне
  • Найдите файл setup где-нибудь в папке .ansible.
  • Запустите его с помощью ./setup или python -B setup

Если он зависает, тогда мы знаем, что проблема здесь точно. Чтобы найти то, что делает его зависанием, вы можете просто открыть файл с помощью редактора и добавить выражения print, главным образом, в метод populate() Facts. Перезапустите script и посмотрим, как долго он пройдет.

Мне кажется, что проблема заключалась в попытке разрешить имя хоста в строке self.facts['fqdn'] = socket.getfqdn() и с небольшим количеством поисковых запросов оказалось, что проблема с разрешением имя удаленного хоста.

Ответ 4

Для меня совершенно другая работа. У меня это было от Debian Jessie (Linux PwC-Deb64 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64 GNU/Linux) до другого образа Debian, который я пытался создать в AWS.

После того, как многие из предложений здесь не сработали для меня, я получил подозрение в отношении "общего" соединения SSH. Я пошел в ansible.cfg и нашел строки ssh_args и установил ControlMaster=no. Это может теперь выполняться медленно, потому что я потерял повышение производительности SSH, которое это должно дать, но похоже, что существует некоторое взаимодействие между этим и apt-get, которое вызывает проблему.

Ваш ansible.cfg может находиться в директории, в которой вы запускаете ansible, или в /etc/ansible. Если последнее, вы можете сделать копию его в локальном каталоге, прежде чем приступать к его изменению!