Estoy usando Ansible para implementar un sitio web Django en mis servidores (producción, puesta en escena, etc), y me gustaría recibir una notificación (a través de la holgura en este caso) si y sólo si para cualquier tarea que falla.

Sólo puedo averiguar cómo se hace si una determinada tarea falla (por lo que supongo que podría agregar un controlador de todas las tareas), pero la intuición me dice que tiene que haber una forma más fácil y más elegante opción.

Básicamente lo que estoy pensando es:

---
- hosts: "{{hosts_to_deploy}}"

- tasks: 

   [...]

  - name: notify slack of deploy failure
    local_action:
      module: slack
      token: "{{slack_token}}"
      msg: "Deploy failed on {{inventory_hostname}}"
    when: # any task failed

He estado buceando en el Ansible documentación, especialmente en el el manejo de errores sección, y de las respuestas de aquí a ENTONCES, pero estoy luchando por encontrar una respuesta a mi pregunta. Así que cualquier ayuda será muy apreciada.

OriginalEl autor vabada | 2016-03-09

2 Comentarios

  1. 36

    No creo que un controlador es una solución, ya que un controlador sólo será notificado si la tarea informes de un estado modificado. En un estado de error, el controlador no será notificado.

    También, los controladores por defecto no será despedido si el playbook fallado. Pero que se puede cambiar. Para que usted necesita para establecer esta en su ansible.cfg:

    force_handlers = True
    

    Pero sí, hay mejores opciones disponibles.

    Si utiliza Ansible 2 puede utilizar el nuevo bloques característica. Bloques de grupo de tareas en conjunto y tienen un rescate de la sección en la que se activa sólo si alguna de las tareas que han fracasado.

    tasks:
      - block:
          - here
          - go
          - all
          - your
          - tasks
        rescue:
          - name: notify slack of deploy failure
            local_action:
              module: slack
              token: "{{slack_token}}"
              msg: "Deploy failed on {{inventory_hostname}}"
    

    Otra opción y especialmente interesante si usted está utilizando el Ansible 1.x puede ser devolución de llamada plugins. Como el nombre sugiere, con este tipo de plugins puede escribir devoluciones de llamada que puede ser despedido en diversos eventos.

    De nuevo, si usted está utilizando el Ansible 2 estás de suerte, porque ya existe un margen de devolución de llamada plugin disponible: https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/callback/slack.py

    Utilizar este plugin necesita habilitar en su ansible.cfg:

    callback_whitelist = slack
    

    Y definir algunas variables de entorno en el sistema para realizar la configuración:

     This plugin makes use of the following environment variables:
        SLACK_WEBHOOK_URL (required): Slack Webhook URL
        SLACK_CHANNEL     (optional): Slack room to post in. Default: #ansible
        SLACK_USERNAME    (optional): Username to post as. Default: ansible
        SLACK_INVOCATION  (optional): Show command line invocation
                                      details. Default: False
    

    Que el plugin pueda necesitar algunas modificaciones para adaptarse a sus necesidades. Si ese es el caso de la copia de la fuente y de la tienda en relación a su playbook como callback_plugins/custom_slack.py y, a continuación, habilitar en su ansible.cfg:

    callback_whitelist = custom_slack
    

    Si utiliza Ansible 1.x tendrás que ver cómo se puede convertir. El API es diferente, ejemplos de la antigua API se puede encontrar aquí: https://github.com/ansible/ansible/tree/v1.9.4-1/plugins/callbacks

    Gracias por la detallada respuesta. Eso era lo que estaba buscando exactamente. La culpa es mía que no he leído acerca de «bloques» en la documentación
    Es fácil pasar por alto las nuevas características. Si quiere ver todas las cosas geniales disponibles, usted puede ver los 30 minutos del video: youtube.com/watch?v=sy8i4VXIVEE
    Las devoluciones de llamada es la mejor opción!
    No debería el rescue cláusula de tener un guión antes?
    No, pertenece a la cuadra. Con un guión delante de él, sería una tarea independiente.

    OriginalEl autor udondan

  2. 3

    Me escribió un ejemplo completo de cómo utilizar los Bloques/Rescate y la Holgura módulo (no devolución de llamada plugin) que proporciona una significativa salida de error con formato:

    La primera respuesta aquí me tienes parte del camino, pero sólo para la persona que viene de esta manera luchando con lo mismo!

    Un simple playbook ejemplo se ve como sigue:

    playbooks/playbook.yml

    - hosts: "{{ target_host | default('127.0.0.1') }}" 
    gather_facts: true 
    
    tareas: 
    - bloquear: 
    - include_role: 
    nombre: install_app 
    - nombre: Saludar al mundo 
    shell: echo "hola mundo!" 
    - error: 
    msg: "he ido y fallas en el juego!" 
    rescate: 
    - include_role: 
    nombre: slack_handler 
    tasks_from: fracaso 
    

    Y en mi slack_handler papel (para reutilización):

    roles/slack_handler/tareas/fracaso.yml

    - nombre: Notificar la Holgura de Playbook Fracaso 
    holgura: 
    nombre de usuario: 'Ansible' 
    color: peligro 
    token: "{{ slack_webhook.split('https://hooks.slack.com/services/')[1] }}" 
    canal: "#la implementación de las alertas" 
    msg: "Ansible error en *{{ ansible_hostname }} ({{ inventory_hostname }})* \n 
    *Tarea*: {{ ansible_failed_task.nombre }} \n 
    *Acción*: {{ ansible_failed_task.acción }} \n 
    *Mensaje de Error*: \n ``{{ ansible_failed_result | to_nice_json }}``" 
    delegate_to: localhost 
    

    Ref: http://www.petewilcock.com/ansible-slack-failure-handler/

    OriginalEl autor monkeymatrix

Dejar respuesta

Please enter your comment!
Please enter your name here