У меня есть доступная игра, как показано ниже, и в большинстве случаев она работает нормально. Но недавно я заметил, что он застревает на некоторых серверах из ALL
группа и просто сидит там. Он даже не продвигается на другие серверы в ALL
список.
# 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
команда просто зависает, и из-за этого также висит анзибль.
Есть ли способ запустить эту команду ps aux | grep app
на всех серверах в ALL
group и составьте список всех серверов, которые выполнили эту команду нормально (и если он зависнет на каком-то сервере, тогда время ожидания и переход на другой сервер во ВСЕМ списке), а затем передать этот список для работы с моей вышеприведенной книгой воспроизведения? Можем ли мы сделать все это в одной книге?
Обновить:-
Я получаю такую ошибку:
ERROR! The 'pause' module bypasses the host loop, which is currently not supported in the free strategy and would instead execute for every host in the inventory list.
The error appears to have been in '/var/lib/jenkins/workspace/process/check.yml': line 10, column 9, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: sleep for 5 sec
^ here
Build step 'Execute shell' marked build as failure
Вы можете собрать факты.
---
hosts: all
gather_facts: True
tasks:
Собирая факты явно, вы заставляете Ansible пытаться подключиться к каждому хосту (и обновлять кеш фактов). Если хост недоступен, он будет пропущен для остальной части playbook. По умолчанию тайм-аут для сбора фактов равен 10 секунд, так что это должно сократить время ожидания.
(Ansible is getting stuck executing scp command on that server). If I have some server in that state, why not just Ansible times out and move to other servers?
Очень вероятно, что пьесы идут с линейная стратегия
По умолчанию игры проходят по линейной стратегии, в которой все хосты будут запускать каждую задачу до того, как любой хост запустит следующую задачу
Использовать бесплатная стратегия
который позволяет каждый хост должен бежать до конца игры так быстро, как он может
- hosts: all
serial: "{{ num_serial }}"
strategy: free
tasks:
Пытаться асинхронный в приведенной ниже книге с 3 хостами в группе «test» асинхронно позволяют хостам спать случайное число (1-10) секунд и ждать 5 секунд, пока хосты завершат работу. Затем повторите попытку собрать async_status и выйдите из спектакля. Следующая игра в localhost запустится, когда хотя бы один хост завершится успешно, и распечатает статус каждого хоста.
- hosts: test
strategy: free
vars:
max_sleep_time: 10
max_wait_time: 5
tasks:
- set_fact:
my_time: "{{ max_sleep_time|random(start=1) }}"
- debug:
msg: "Sleep {{ my_time }} seconds"
- command: "sleep {{ my_time }}"
register: play_status
async: "{{ max_wait_time }}"
poll: 0
- async_status:
jid: "{{ play_status.ansible_job_id }}"
register: play_status
until: play_status.finished
retries: 1
- hosts: localhost
tasks:
- debug:
msg: "{{ item }} finished: {{ hostvars[item].play_status.finished }}"
loop: "{{ groups['test'] }}"
Выходные данные (в сокращении) показывают, что хосты test_01 и test_03 спали 9 секунд, не завершили вовремя (max_wait_time: 5) и потерпели неудачу.
TASK [debug]
ok: [test_01] => {
"msg": "Sleep 9 seconds"
}
ok: [test_02] => {
"msg": "Sleep 1 seconds"
}
ok: [test_03] => {
"msg": "Sleep 9 seconds"
}
TASK [async_status]
changed: [test_02]
fatal: [test_01]: FAILED! => {"ansible_job_id": "10701665445.1564", "attempts": 1, "changed": false, "finished": 0, "started": 1}
fatal: [test_03]: FAILED! => {"ansible_job_id": "752000555573.1558", "attempts": 1, "changed": false, "finished": 0, "started": 1}
...
TASK [debug]
ok: [localhost] => (item=test_01) => {
"msg": "test_01 finished: 0"
}
ok: [localhost] => (item=test_02) => {
"msg": "test_02 finished: 1"
}
ok: [localhost] => (item=test_03) => {
"msg": "test_03 finished: 0"
}
...
PLAY RECAP
localhost : ok=2 changed=0 unreachable=0 failed=0
test_01 : ok=3 changed=1 unreachable=0 failed=1
test_02 : ok=4 changed=2 unreachable=0 failed=0
test_03 : ok=3 changed=1 unreachable=0 failed=1
Устанавливать max_wait_time > max_sleep_time
чтобы увидеть все хосты готовыми.