Комплексная проверка стандартного выхода в Ansible
Я запускаю работу на удаленном сервере с Ansible. Stdout генерирует некоторый вывод, где иногда появляются ошибки. Текст ошибки имеет вид
#ERROR FMM0129E The following error was returned by the vSphere(TM) API: 'Cannot complete login due to an incorrect user name or password.'.
Дело в том, что некоторые из этих ошибок могут быть безопасно проигнорированы, и только те, которых нет в моем списке ложных срабатываний, могут вызвать ошибку.
У меня вопрос: можно ли это сделать чисто Ansible?
Единственное, что приходит на ум, - это простая проверка failed_when, которая в этом случае терпит неудачу. Я думаю, что эта "сложная" проверка вывода должна выполняться из Ansible, вызывая скрипт python / shell / etc, чтобы помочь.
2 ответа
Если вы все равно выполняете команду оболочки удаленно, то нет никаких причин, по которым вы не могли бы обернуть это в сценарий оболочки, который возвращает код состояния, отличный от 0, для вещей, которые вас интересуют, а затем просто выполните это через script
модуль.
example.sh
#!/bin/bash
randomInt=$[ 1 + $[ RANDOM % 10 ]]
echo $randomInt
if [ $randomInt == 1 ]; then
exit 1
else
exit 0
fi
И затем используйте это в своей пьесе:
- name: run example.sh
script: example.sh
Ansible автоматически увидит любые коды возврата, отличные от 0, если задача не выполнена.
Вместо failed_when
вы могли бы использовать ignore_errors: true
что даст вам возможность передать невыполненную задачу и переадресовать стандартный вывод на другую задачу. Но я бы не рекомендовал это, поскольку, по моему мнению, задача никогда не должна сообщать о неудачном состоянии по назначению. Но если вы чувствуете, что это вариант для вас, даже был бы способ сбросить счетчик ошибок, чтобы статистика Ansible в конце была правильной.
- some: task
register: some_result
ignore_errors: true
- name: Reset errors after intentional fail
meta: clear_host_errors
when: some_result | failed
- another: task
check: "{{ some_result.stdout }}
when: some_result | failed
Последнее задание затем проверит ваш стандартный вывод в пользовательском сценарии или в любом другом месте и сообщит о самом сбойном состоянии (код возврата!= 0).
Насколько я знаю clear_host_errors
Эта функция еще не документирована, а срок действия коммита около месяца, поэтому я думаю, что она будет доступна только в Ansible 2.0.1.
Другая идея заключалась бы в том, чтобы обернуть вашу задачу в сценарий, который проверяет вывод, или направить его в этот сценарий. Это, очевидно, будет работать только в том случае, если вы запускаете команду оболочки, а не с любыми другими модулями.
Кроме этих двух вариантов, я не думаю, что есть что-то еще доступное.