Комплексная проверка стандартного выхода в 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.


Другая идея заключалась бы в том, чтобы обернуть вашу задачу в сценарий, который проверяет вывод, или направить его в этот сценарий. Это, очевидно, будет работать только в том случае, если вы запускаете команду оболочки, а не с любыми другими модулями.

Кроме этих двух вариантов, я не думаю, что есть что-то еще доступное.

Другие вопросы по тегам