Необработанный модуль оболочки возвращает ошибку, когда результаты 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. Ваша система работает правильно.

Чтобы предотвратить невозможность остановить выполнение воспроизведения игрой в этой ошибке, вы можете:

  • добавить ignore_errors: yes в задачу

  • использовать параметр failed_when: с надлежащим условием

Поскольку 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, чтобы задача не сообщалась как "измененная" каждый раз.

Все параметры описаны в документе "Обработка ошибок в книгах" .