Ansible застревает на каком-то сервере, который находится в плохом состоянии ps? - PullRequest
4 голосов
/ 11 июня 2019

У меня есть сборник пьес, как показано ниже, и он прекрасно работает в большинстве случаев.Но в последнее время я замечаю, что он застревает на некоторых серверах из группы ALL и просто сидит там.Он даже не перемещается на другие серверы в списке ALL * 1004. *.

# This will copy files
---
- hosts: ALL
  serial: "{{ num_serial }}"
  tasks:
      - name: copy files
        shell: "(ssh -o StrictHostKeyChecking=no abc.com 'ls -1 /var/lib/jenkins/workspace/copy/stuff/*' | parallel -j20 'scp -o StrictHostKeyChecking=no abc.com:{} /data/records/')"

      - name: sleep for 5 sec
        pause: seconds=5

Так что, когда я начал отладку, я заметил, что на реальном сервере он застревает - я могу ssh(логин) хорошо, но когда я запускаю команду ps, она просто зависает, и я не возвращаю свой курсор назад, что означает, что ansible также застревает при выполнении команды scp, указанной выше на этом сервере.

Итак, мой вопрос: даже если у меня есть сервер в этом состоянии, почему бы просто не отключить Ansible и не перейти на другой сервер?Есть ли здесь что-нибудь, что мы можем сделать, чтобы ansible не останавливал все, просто ожидая ответа от этого сервера.

Примечание сервер запущен и работает, и я могу ssh нормально, но когда мы запускаем команду ps, она просто зависает и из-за этого Ansible также зависает.

Есть ли способ запустить этовведите команду ps aux | grep app на всех серверах, входящих в группу ALL , и составьте список всех серверов, которые выполнили эту команду нормально (а если произойдет зависание на каком-либо сервере, то время ожидания и перейдите на другой сервер в списке ALL).а затем передать этот список для работы с моей рассмотренной выше пьесой?Можем ли мы сделать все это в одной пьесе?

Ответы [ 3 ]

2 голосов
/ 12 июня 2019

Вы можете использовать стратегии для достижения своей цели. По умолчанию:

Игры запускаются с линейной стратегией, в которой все хосты будут работать каждый задание, прежде чем какой-либо хост запускает следующую задачу

Используя бесплатную стратегию, каждый хост будет работать до конца игры так быстро, как только сможет. Например:

---
- hosts: ALL
  strategy: free
  tasks:
      - name: copy files
        shell: "(ssh -o StrictHostKeyChecking=no abc.com 'ls -1 /var/lib/jenkins/workspace/copy/stuff/*' | parallel -j20 'scp -o StrictHostKeyChecking=no abc.com:{} /data/records/')"

      - name: sleep for 5 sec
        pause: seconds=5

Другим вариантом будет использование timeout для запуска вашей команды, затем использование registers для обработки, была ли команда выполнена успешно или нет. Например, timeout 5 sleep 10 возвращает 124 из-за тайм-аута, а timeout 5 sleep 3 возвращает 0, потому что команда завершается до истечения времени ожидания. В скрипте ansible вы можете использовать что-то вроде:

  tasks:
     - shell: timeout 5 ps aux | grep app
       register: result
       ignore_errors: True

     - debug:
         msg: timeout occured
       when: result.rc == 124
2 голосов
/ 11 июня 2019

Ansible не имеет этой функции, и может быть даже опасно иметь ее.Мое предложение в этом случае будет следующим: увидеть ошибку, перестроить сервер , запустить снова.

Можно встроить нужную функцию в свою книгу, что вы могли бы сделать, этоимейте фиктивную задачу async , которая вызывает проблему, и проверьте ее результат.Если асинхронная задача не была завершена в разумные сроки, используйте задачу meta: end_host для перехода на следующий хост.

Возможно, вам потребуется пометить некоторые из этих задач с помощью ignore_errors: yes.

Извините, что я не могу дать вам полный ответ, поскольку я никогда не пытался это сделать.

1 голос
/ 26 июня 2019

Как сказал "Alassane Ndiaye", вы можете попробовать приведенный ниже фрагмент кода. Где я даю условие, когда оболочка не прервана

tasks:
     - shell: timeout 5 ps aux | grep app
       register: result
       ignore_errors: True

     - name: Run your shell command
       shell:  "(ssh -o StrictHostKeyChecking=no abc.com 'ls -1 /var/lib/jenkins/workspace/copy/stuff/*' | parallel -j20 'scp -o StrictHostKeyChecking=no abc.com:{} /data/records/')"
       when: result.rc != 124 && result.rc != 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...