Может ли ansible ad-hoc терпеть сбои некоторых хостов?

Я знаю, что ansible playbooks может установить max_fail_percentage, чтобы разрешить playbook прогрессировать, если хотя бы этот процент хостов преуспел. Однако я хотел запустить специальную команду, которая завершалась успешно (состояние выхода 0), если хотя бы процент хостов выполнялся без ошибок. Является ли это возможным?


person Capi Etheriel    schedule 24.01.2015    source источник


Ответы (1)


Если у вас есть playbook, который влияет, скажем, на 10 хостов, и в какой-то момент во время выполнения он дает сбой на 1 хосте, Ansible просто продолжит (если вы вообще не установите max_fail_percentage) на всех остальных хостах. Это поведение по умолчанию, обычно плейбуки перестают выполнять какие-либо шаги на хосте, на котором произошел сбой.

Это также упоминается в документах Ansible: Ansible — max_failure_percentage

Это поведение точно такое же для специальных команд. Тест, тест, тест...

ИЗМЕНИТЬ:

Просто Ansible не будет этого делать, однако вы можете переопределить статус выхода, перенаправив вывод Ansible, например, в однострочник perl и выйти там с другим кодом, это довольно уродливо, но работает :)

См. пример ниже, он завершается с 0, только если > 65% хостов успешно завершены, в противном случае код выхода равен 2. Чтобы отловить сбои и как-то их проанализировать, вам нужно перенаправить STDERR в STDOUT из команды ansible (таким образом, 2>&1 в конце команды Ansible, иначе Perl ее не увидит)

$ ansible all -i provisioning/vagrant-inventory -u vagrant --private-key=~/.vagrant.d/insecure_private_key -m ping 2>&1 | perl -pe 'BEGIN { $failed=0; $success=0;} END { $exit_code=( $success/($success+$failed) ) > 0.65 ? 0 : 2; exit $exit_code;} $failed++ if /\| FAILED/i; $success++ if /\| success/i;'
192.168.111.210 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.111.200 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.111.211 | FAILED => SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh

$ echo $?
0
person Michal Gasek    schedule 24.01.2015
comment
В специальных командах есть только одна команда (или play, если хотите). Конечно, специальные команды будут выполняться на каждом хосте, даже если он выйдет из строя: книги воспроизведения одинаковы, max_fail_percentage останавливает следующее воспроизведение, а не текущее. - person Capi Etheriel; 26.01.2015
comment
То, что я ищу, - это какой-то способ, чтобы статус выхода команды был равен 0, если хотя бы X хостов выполнялись нормально. - person Capi Etheriel; 26.01.2015
comment
Таким образом, ответ нет, ansible не может терпеть сбои хоста самостоятельно. Но да, вы можете сделать это, обернув его в магию perl :) - person Capi Etheriel; 27.01.2015
comment
Я бы тоже не ожидал, что это произойдет, коды выхода из Ansible кажутся правильными IMO. Стандартным поведением является код выхода 2, если произошел сбой на каком-либо хосте, и 3, если какой-то хост недоступен. Однажды на GitHub была дискуссия по этому поводу. Для необычных вариантов использования - необычные решения ;) - person Michal Gasek; 27.01.2015