2016-12-07 2 views
10

Я использую модуль оболочки Ansible, чтобы найти определенную строку и сохранить ее в переменной. Но если grep ничего не нашел, я получаю сообщение об ошибке.Необработанный модуль оболочки возвращает ошибку, когда результаты grep пустые

Пример:

- name: Get the http_status 
    shell: grep "http_status=" /var/httpd.txt 
    register: cmdln 
    check_mode: no 

Когда я запускаю этот анзибль пьес, если http_status строка не существует, сборник пьес останавливается. Я не получаю stderr.

Как я могу сделать Ansible run без перерыва, даже если строка не найдена?

+0

мой вопрос, если пусто и я хочу, чтобы запустить анзибль без interption – SSN

ответ

11

Как вы заметили, ansible прекратит выполнение, если код выхода grep не равен нулю. Вы можете игнорировать его с помощью ignore_errors.

Еще один трюк состоит в том, чтобы направить выход grep на cat. Таким образом, код выхода cat всегда будет равен нулю, так как его stdin - это stdout grep. Он работает, если есть совпадение, а также когда нет совпадения. Попробуй.

- name: Get the http_status 
    shell: grep "http_status=" /var/httpd.txt | cat 
    register: cmdln 
    check_mode: no 
15

grep по дизайну возвращает код 1, если данная строка не найдена. Несоблюдение дизайна прекращает выполнение, если код возврата отличается от 0. Ваша система работает исправно.

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

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

Все варианты описаны в документе Error Handling In Playbooks.

+0

бонусных баллов для включения некоторых реальной неудачи определения состояния с помощью failed_when, и предложения использовать changed_when: ложный, чтобы избежать появлений системных изменений в анзибле вывод! –

Смежные вопросы