El módulo de shell ansible devuelve un error cuando los resultados de grep están vacíos
(2)
Estoy usando el módulo shell de Ansible para encontrar una cadena en particular y almacenarla en una variable. Pero si grep no encuentra nada me sale un error.
Ejemplo:
- name: Get the http_status
shell: grep "http_status=" /var/httpd.txt
register: cmdln
check_mode: no
Cuando ejecuto este http_status
Ansible si la cadena http_status
no está allí, el Playbook se detiene. No me estoy poniendo stderr.
¿Cómo puedo hacer que Ansible se ejecute sin interrupción incluso si no se encuentra la cadena?
Como observó, ansible detendrá la ejecución si el código de salida grep
no es cero. Puedes ignorarlo con ignore_errors
.
Otro truco es canalizar la salida grep a cat
. Así cat
código de salida de cat
siempre será cero ya que su stdin es la salida estándar de grep. Funciona si hay una coincidencia y también cuando no hay coincidencia. Intentalo.
- name: Get the http_status
shell: grep "http_status=" /var/httpd.txt | cat
register: cmdln
check_mode: no
grep
by design devuelve el código 1 si no se encontró la cadena dada. Ansible by design detiene la ejecución si el código de retorno es diferente de 0. Su sistema está funcionando correctamente.
Para evitar que Ansible detenga la ejecución del libro de jugadas en este error, puede:
agregar
ignore_errors: yes
parámetro a la tareause
failed_when:
parámetro con una condición adecuada
Debido a que grep
devuelve el código de error 2 para las excepciones, el segundo método parece más apropiado, por lo que:
- name: Get the http_status
shell: grep "http_status=" /var/httpd.txt
register: cmdln
failed_when: "cmdln.rc == 2"
check_mode: no
También puede considerar la adición de changed_when: false
para que la tarea no se informe como "cambiada" cada vez.
Todas las opciones se describen en el documento Manejo de errores en libros de jugadas .