Необработанный модуль оболочки возвращает ошибку, когда результаты grep пусты
Я использую модуль Ansible shell для поиска конкретной строки и сохранения ее в переменной. Но если grep ничего не нашел, я получаю сообщение об ошибке.
Пример:
- name: Get the http_status
shell: grep "http_status=" /var/httpd.txt
register: cmdln
check_mode: no
Когда я запускаю эту игру Ansible, если строка http_status
отсутствует, playbook останавливается. Я не получаю stderr.
Как я могу сделать Ansible run без прерывания, даже если строка не найдена?
Ответы
Ответ 1
Как вы заметили, ansible прекратит выполнение, если код выхода grep
не равен нулю. Вы можете игнорировать его с помощью ignore_errors
.
Еще один трюк - передать вывод grep на cat
. Таким образом, код выхода cat
всегда будет равен нулю, так как его stdin - grep stdout. Он работает, если есть совпадение, а также когда нет совпадения. Попробуйте.
- name: Get the http_status
shell: grep "http_status=" /var/httpd.txt | cat
register: cmdln
check_mode: no
Ответ 2
grep
по дизайну возвращает код 1, если данная строка не найдена. Невозможно выполнить проект, если код возврата отличается от 0. Ваша система работает правильно.
Чтобы предотвратить невозможность остановить выполнение воспроизведения игрой в этой ошибке, вы можете:
Поскольку grep
возвращает код ошибки 2 для исключений, второй метод кажется более подходящим, поэтому:
- name: Get the http_status
shell: grep "http_status=" /var/httpd.txt
register: cmdln
failed_when: "cmdln.rc == 2"
check_mode: no
Вы также можете рассмотреть возможность добавления changed_when: false
, чтобы задача не сообщалась как "измененная" каждый раз.
Все параметры описаны в документе "Обработка ошибок в книгах" .