grep ansible

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 tarea

  • use 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 .